• Android简易实战教程--第四十九话《满屏拖动的控件》


    今天做个有意思的效果吧,控件的拖拽,简单实用,逻辑清晰点3分钟看完。

    说的很高大上,其实就是拖动Button按钮跟着鼠标位置满手机屏幕跑罢了。


    直接上简单的代码吧:

    public class MainActivity extends Activity implements View.OnTouchListener {
        private Button mButton;
        private ViewGroup mViewGroup;
        private int xDelta;
        private int yDelta;
        public static final String TAG = "YDL";
        private RelativeLayout.LayoutParams mParams;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mViewGroup = (ViewGroup) findViewById(R.id.root);
    
            mButton = (Button) findViewById(R.id.id_text);
    
            mParams = new RelativeLayout.LayoutParams(
                    ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    
            mParams.leftMargin = 50;
            mParams.topMargin = 50;
    
            mButton.setLayoutParams(mParams);
    
            mButton.setOnTouchListener(this);
    
        }
    
        @Override
        public boolean onTouch(View view, MotionEvent event) {
            //手指触摸控件,就会执行这里。鼠标点击控件位置相对屏幕的坐标
            final int x = (int) event.getRawX();
            final int y = (int) event.getRawY();
            Log.d(TAG, "onTouch: x= " + x + "y=" + y);//x= 192y=185
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    xDelta = x - mParams.leftMargin;//xDelta= 142192-50yDelta=135185-50)得到控件相对自己的坐标位置。(鼠标点击点距离控件左上角)
                    yDelta = y - mParams.topMargin;
                    Log.d(TAG, "ACTION_DOWN: xDelta= " + xDelta + "yDelta=" + yDelta);//xDelta= 142yDelta=135
                    break;
                case MotionEvent.ACTION_MOVE:
    
                    int xDistance = x - xDelta;//x= 199y=185(鼠标移动后下一位置的坐标)- 鼠标相对控件本身的坐标 = 控件位于屏幕上的新坐标位置       xDistance= 57yDistance=50
                    int yDistance = y - yDelta;
                    Log.d(TAG, "ACTION_MOVE: xDistance= " + xDistance + "yDistance=" + yDistance);//xDistance= 57yDistance=50
    
                    mParams.leftMargin = xDistance;//把新坐标位置设置给控件
                    mParams.topMargin = yDistance;
                    view.setLayoutParams(mParams);//把坐标位置重新赋值给button
                    break;
            }
            return true;
        }
    


    MainActivity实现了OnTouchListener接口,覆写了onTouch方法,每次回调这个方法通过x和y变量记录当前的坐标。

    ACTION_DOWN是在按下的时候调用(没抬起来只调用一次),通过xDelta和yDelta来记录第一次按下的点相对于控件左上角的位置,也就是相对距离。

    ACTION_MOVE移动的时候不断调用,通过xDistance和yDistance来记录移动的相对距离作为leftMargin和topMargin再动态设置给控件。

    最后,调用setLayoutParams方法重新设置控件坐标位置。


    文字解释不够多?下面一张图应该更清楚吧?


    运行程序快点满屏跑动吧!


    喜欢我的朋友可以关注我的博客专栏。

    也可以打开微信搜索公众号  Android程序员开发指南  或者手机扫描下方二维码 在公众号阅读更多Android文章。

    微信公众号图片:



  • 相关阅读:
    maven打包将依赖和配置外置的配置方式
    AngularJS零碎总结
    Python零碎总结
    win10 平台 elasticsearch 与 elasticsearch-head 的安装
    DDD中的分层架构
    读书有感--------软件的设计原则
    DDD初探
    HTTP could not register URL http://+:86/. 设置VS默认以管理员权限打开
    .net 实战 根据configuration选项生成不同的config文件
    asp.net mvc5轻松实现插件式开发
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299468.html
Copyright © 2020-2023  润新知