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

  • 拖动控件事件 和 双击事件
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值