Android 在页面任意拖动View

public class TestActivity extends AppCompatActivity {

    private ImageView iv1;
    private float downX;
    private float downY;
    private int screenWidth;
    private int screenHeight;
    private int actionBarHeight = 0;

    @SuppressLint("ClickableViewAccessibility")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_boll_free_fall);

        screenWidth= getDispaly(this).widthPixels;
        screenHeight= getDispaly(this).heightPixels;

        iv1 = findViewById(R.id.iv_1);

        iv1.post(new Runnable() {
            @Override
            public void run() {
                if(getSupportActionBar() != null){
                    actionBarHeight = getSupportActionBar().getHeight();
                    Log.d("xiazhenjie","actionBarHeight--" + actionBarHeight);
                }
            }
        });

        iv1.setOnTouchListener((v, event) -> {
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    downX = event.getX();
                    downY = event.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    Log.e("kid","ACTION_MOVE");
                    final float xDistance = event.getX() - downX;
                    final float yDistance = event.getY() - downY;
                    int l, r, t, b;
                    //当水平或者垂直滑动距离大于10,才算拖动事件
                    if (Math.abs(xDistance) > 10 || Math.abs(yDistance) > 10) {
                        l = (int) (iv1.getLeft() + xDistance);
                        r = l + iv1.getWidth();
                        t = (int) (iv1.getTop() + yDistance);
                        b = t + iv1.getHeight();
                        //不划出边界判断,此处应按照项目实际情况,因为本项目需求移动的位置是手机全屏,
                        // 所以才能这么写,如果是固定区域,要得到父控件的宽高位置后再做处理
                        if(l < 0){
                            l = 0;
                            r = l + iv1.getWidth();
                        }else if(r > screenWidth){
                            r = screenWidth;
                            l = r - iv1.getWidth();
                        }
                        if(t < 0){
                            t = 0;
                            b = t + iv1.getHeight();
                        }else if(b > screenHeight - actionBarHeight){//如果有Actionbar,也需要考虑其高度
                            b = screenHeight - actionBarHeight;
                            t = b - iv1.getHeight();
                        }
                        iv1.layout(l, t, r, b);
                    }
                    break;
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_CANCEL:
                    iv1.setPressed(false);
                    break;
            }
            return true;
        });
    }

    public static DisplayMetrics getDispaly(Context context){
        DisplayMetrics dm = context.getResources().getDisplayMetrics();
        return dm;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容