很简单,只需要自定义一个View就可以。
布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.myapplication.initview.CustomViews
android:id="@+id/cus"
android:layout_marginTop="60dp"
android:src="@mipmap/home_sign"
android:layout_width="60dp"
android:layout_height="60dp" />
</RelativeLayout>
然后自定义的View:
package com.example.myapplication.initview;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.DecelerateInterpolator;
import android.widget.ImageView;
/**
* Created by pw on 2019/3/28 13:32
* E-Mail Address: pw163.com
*/
public class CustomViews extends ImageView {
private int maxWidth;
private int maxHeight;
private int viewWidth;
private int viewHeight;
private float downx;
private float downy;
public CustomViews(Context context) {
super(context, null);
}
public CustomViews(Context context, AttributeSet attrs) {
super(context, attrs, 0);
}
public CustomViews(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//屏幕得宽度
maxWidth = UiUtil.getMaxWidth(getContext());
//屏幕得高度
maxHeight = UiUtil.getMaxHeight(getContext());
/**
* 控件的宽高
*/
viewWidth = canvas.getWidth();
viewHeight = canvas.getHeight();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
clearAnimation();
downx = event.getX();
downy = event.getY();
return true;
case MotionEvent.ACTION_MOVE:
float moveX = event.getRawX() - downx;
float moveY = event.getRawY() - downy;
moveX = moveX < 0 ? 0 : (moveX + viewWidth > maxWidth) ? (maxWidth - viewWidth) : moveX;
moveY = moveY < 0 ? 0 : (moveY + viewHeight) > maxHeight ? (maxHeight - viewHeight) : moveY;
this.setY(moveY);
this.setX(moveX);
return true;
case MotionEvent.ACTION_UP:
//做吸附效果
float centerX = getX() + viewWidth / 2;
if (centerX > maxWidth/2){
//靠右吸附
animate().setInterpolator(new DecelerateInterpolator())
.setDuration(500)
.xBy(maxWidth-viewWidth-getX())
.start();
}else {
animate().setInterpolator(new DecelerateInterpolator())
.setDuration(500)
.x(0)
.start();
}
return true;
default:
return super.onTouchEvent(event);
}
}
}
本文介绍如何在Android中创建一个可拖动的视图,并实现视图在拖动过程中自动吸附到屏幕边缘的功能。通过自定义View并设置布局,可以实现这一交互效果。
2433

被折叠的 条评论
为什么被折叠?



