制作一个可以拖动的view

239 阅读1分钟

在开发过程中难免会遇到有view需要拖动的情况,那么如何简单的制作一个可以自己随意拖动的view呢? 下面代码拷贝到项目中就好,

  1. 拷贝代码到项目中
  2. 把这个view类当成父类放到xml布局中,那么这个布局就可以随意拖动啦!
package cn.zhiup.mobile.course.live.tentcentLiveStudio;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.FrameLayout;

import cn.zhiup.baselayer.utils.ScreenUtils;

public class DragView extends FrameLayout{
    float moveX;
    float moveY;

    public DragView(Context context) {
        super(context);
    }

    public DragView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                moveX = event.getX();
                moveY = event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                float x = getX() + (event.getX() - moveX);
                float y = getY() + (event.getY() - moveY);
                if(x<0){
                    x=0;
                }else if(x+getWidth()>ScreenUtils.getInstance().getScreenWidth(getContext())){
                    x=ScreenUtils.getInstance().getScreenWidth(getContext())-getWidth();
                }
                setTranslationX(x);
                if(y<0){
                    y=0;
                }else if(y+getHeight()+ScreenUtils.getInstance().getStatusHeight(getContext())>ScreenUtils.getInstance().getScreenHeight(getContext())){
                    y=ScreenUtils.getInstance().getScreenHeight(getContext())-getHeight()-ScreenUtils.getInstance().getStatusHeight(getContext());
                }
                setTranslationY(y);
                break;
            case MotionEvent.ACTION_UP:
                break;
            case MotionEvent.ACTION_CANCEL:
                break;
        }

        return true;
    }
}

依赖代码

  1. 获得手机状态栏高度
/**
     * 获得状态栏的高度
     *
     * @param context
     * @return
     */
    public int getStatusHeight(Context context) {
        int statusHeight = -1;
        try {
            Class<?> clazz = Class.forName("com.android.internal.R$dimen");
            Object object = clazz.newInstance();
            int height = Integer.parseInt(clazz.getField("status_bar_height").get(object).toString());
            statusHeight = context.getResources().getDimensionPixelSize(height);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return statusHeight;
    }
  1. 获得手机屏幕高度
/**
     * 获得屏幕高度
     *
     * @param context
     * @return
     */
    public int getScreenHeight(Context context) {
        WindowManager mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics mDisplayMetrics = new DisplayMetrics();
        mWindowManager.getDefaultDisplay().getMetrics(mDisplayMetrics);
        return mDisplayMetrics.heightPixels;
    }
  1. 获得手机屏幕宽度
/**
     * 获取屏幕宽度
     *
     * @param context
     * @return
     */
    public int getScreenWidth(Context context) {
        WindowManager mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics mDisplayMetrics = new DisplayMetrics();
        mWindowManager.getDefaultDisplay().getMetrics(mDisplayMetrics);
        return mDisplayMetrics.widthPixels;
    }