由于项目中有要求所以需要做一个随手指移动的悬浮球吧,我决定使用自定义的View 进行实现,由于页面是模拟真实页面的,遇到一些麻烦,所以请教了我以前的同事,并非常感谢我同事给与我的建议。当页面中有其他view的时候,当点击其他view时隐藏或是显示别的view,会影响到移动的view的位置,并使移动view还原到初始的位置,最后发现是view的重新测量导致的,所以决定在移动view的外层加一个FrameLayout,就没有这个问题了;以下是代码:
自定义的view
package com.example.dragview;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.FrameLayout;
import android.widget.ImageView;
/**
* @author
* @date 2019/3/14
* 描述:
*/
@SuppressLint("AppCompatCustomView")
public class MyView extends ImageView {
private static final int DELAY_TIME = 2000;
private FrameLayout.LayoutParams lp;
private float down_x;
private float down_y;
private float move_x;
private float move_y;
private Context context;
MyHandler myHandler;
private int width;
private int height;
private int screenWidth;
private int screenHeight;
private boolean isDrag = false;
private int l, r, t, b;
//判断控件是否移动,以判断是否是点击事件
public boolean isDrag() {
return isDrag;
}
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
this.context = context;
myHandler = new MyHandler(this);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = Util.dp2px(context, 100f);
h