控件的移动事件和双击事件

来源:互联网 发布:小草水冷淘宝 编辑:程序博客网 时间:2024/05/21 12:42
  • 拖动控件事件 和 双击事件
public class MoveActivity extends Activity {    private LinearLayout mLl_move;    private int mWidth;    private int mHeight;    private long[]  mNum = new long[2];    private int mStartY;    private int mStartX;    private SharedPreferences sp ;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_move);        mLl_move = (LinearLayout) findViewById(R.id.ll_move);        sp = getSharedPreferences("config", MODE_PRIVATE);        WindowManager manager = (WindowManager) getSystemService(WINDOW_SERVICE);        //得到一张白纸        DisplayMetrics metrics = new DisplayMetrics();        //给白纸设置整个屏幕        manager.getDefaultDisplay().getMetrics(metrics);        //得到屏幕的宽高        mWidth = metrics.widthPixels;        mHeight = metrics.heightPixels;        //回显操作        int x = sp.getInt("x", 100);        int y = sp.getInt("y", 100);       /*         //这个方法不能在onCreate方法中使用,因为onCreate方法中是初始化控件的,所以控件的宽高得不到的        mLl_move.layout(x , y ,x + mLl_move.getWidth() , y + mLl_move.getHeight());*/        //这个方法是初始化控件前,重新设置控件的属性-LayoutParams- , 就是在加载控件前先给它一个位置        //得到控件的父布局        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mLl_move.getLayoutParams();        //通过父布局的属性来设置控件的位置,设置控件左上角的坐标        params.leftMargin = x;        params.topMargin = y ;        mLl_move.setLayoutParams(params);        showMove();        doubleEvent();    }
  • 双击事件的简单解释图

这里写图片描述

    /**     * 双击事件     * */    private void doubleEvent() {        mLl_move.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //参数1. 拷贝的原数组                //2.从原数组那个位置开始拷贝                //3.拷贝到目标数组                //4.从目标数组那个位置开始去拷贝                //5.拷贝的长度                System.arraycopy(mNum , 1 , mNum , 0 ,mNum.length-1 );                //得到开机的时间                mNum[1] = SystemClock.uptimeMillis();                if (mNum[0] >= (SystemClock.uptimeMillis() - 500)){                    int l = (mWidth - mLl_move.getWidth()) / 2;                    int t = (mHeight - mLl_move.getHeight()-25) / 2;                    mLl_move.layout(l , t , l+mLl_move.getWidth() , t+mLl_move.getHeight());                }            }        });    }    /**     * 拖动事件     * */    private void showMove() {        mLl_move.setOnTouchListener(new View.OnTouchListener() {            @Override            public boolean onTouch(View v, MotionEvent event) {                switch (event.getAction()){                    case MotionEvent.ACTION_DOWN:                        //按下的事件,得到XY的坐标                        LogUtil.d("按下的事件","sssss");                        mStartX = (int) event.getRawX();                        mStartY = (int) event.getRawY();                        break;                    case MotionEvent.ACTION_MOVE:                        //移动的事件,移动后的XY的坐标                        LogUtil.d("移动的事件","sssss");                        int newX = (int) event.getRawX();                        int newY = (int) event.getRawY();                        //计算偏移量                        int dX = newX - mStartX ;                        int dY = newY - mStartY ;                        //移动相应的偏移量,重新绘制                        //这是原来控件的位置                        int left = mLl_move.getLeft();                        int top = mLl_move.getTop();                        //移动后的位置,就是原来的坐标+偏移量                        left += dX;                        top  += dY;                        //宽度和高度,就是最新的XY周坐标加上控件的宽高度                        int right = left + mLl_move.getWidth();                        int bottom = top + mLl_move.getHeight();                        //开始绘制之前先判断位置是否超出了屏幕                        if (left < 0 || top < 0 || right > mWidth || bottom > mHeight-25 ){                            break;                        }                        mLl_move.layout(left, top ,right ,bottom);                        //更新坐标                        mStartX = newX;                        mStartY = newY;                        break;                    case MotionEvent.ACTION_UP:                        //抬起的事件                        LogUtil.d("抬起的事件","sssss");                        //保存位置数据,为了回显操作                        int x = mLl_move.getLeft();                        int y = mLl_move.getTop();                        SharedPreferences.Editor edit = sp.edit();                        edit.putInt("x" , x);                        edit.putInt("y" , y);                        edit.apply();                        break;                }                return false;//这里要返回true  //如果还有点击事件就返回false            }        });    }}
  • 触摸事件和点击事件的冲突
    • 点击事件 : 一组事件的集合,按下+抬起
    • 触摸事件 : 每个事件都是一个单独的事件,按下,移动,抬起
    如果只有触摸事件:return true表示事件执行    如果点击事件和触摸事件共同存在,触摸事件的事件是会点击事件消费掉    先执行触摸 :  然后执行其他事件    点击 :       按下+抬起    1.    return false    触摸 :  按下 执行完  ->  移动  执行完 -> 抬起     触摸+点击 :   按下(触摸) 拦截 - > 按下(点击) 执行 - > 抬起(触摸) 拦截 - > 抬起(点击) 执行 - > 输出(触摸) - > 输出(点击)    2.    return true    触摸 : 按下 -> 移动 -> 抬起    触摸+点击  按下(触摸) 执行 ->  移动(触摸) -> 抬起(触摸)    *****    如果只有触摸事件:return true;    如果触摸+点击事件:触摸事件return false
0 0