可随手指滑动的布局DragRelativeLayout

package com.youjing.yingyudiandu.diandubook.widget;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;

import com.youjing.yingyudiandu.R;
import com.youjing.yingyudiandu.englishreading.bean.NotePicContentBean;


public class DragRelativeLayout extends RelativeLayout {


    private int defaultAlignDistance = 40;

    private float alignDistance ;

    private boolean leftAlign = true;
    private boolean rightAlign = true;
    private boolean topAlign = true;
    private boolean bottomAlign = true;
    private int l;
    private int t;

    public int getL() {
        return l;
    }
    public void setL(int l) {
        this.l = l;
    }

    public int getT() {
        return t;
    }
    public void setT(int t) {
        this.t = t;
    }

    private int index;
    private NotePicContentBean.Data.Pic_part partBean;

    public void setIndex(int index) {
        this.index = index;
    }

    public int getIndex() {
        return index;
    }

    public NotePicContentBean.Data.Pic_part getPartBean() {
        return partBean;
    }

    public void setPartBean(NotePicContentBean.Data.Pic_part partBean) {
        this.partBean = partBean;
    }

    private OnDragViewClickListener onDragViewClickListener;
    private OnDragViewMoveListener onDragViewMoveListener;


    public  interface OnDragViewClickListener{
        void onDragViewClick(View view);
    }
    public  interface OnDragViewMoveListener{
        void onDragViewMove(View view);
    }

    public float getAlignDistance() {
        return alignDistance;
    }

    public void setAlignDistance(float alignDistance) {
        this.alignDistance = alignDistance;
    }

    public boolean isLeftAlign() {
        return leftAlign;
    }

    public void setLeftAlign(boolean leftAlign) {
        this.leftAlign = leftAlign;
    }

    public boolean isRightAlign() {
        return rightAlign;
    }

    public void setRightAlign(boolean rightAlign) {
        this.rightAlign = rightAlign;
    }

    public boolean isTopAlign() {
        return topAlign;
    }

    public void setTopAlign(boolean topAlign) {
        this.topAlign = topAlign;
    }

    public boolean isBottomAlign() {
        return bottomAlign;
    }

    public void setBottomAlign(boolean bottomAlign) {
        this.bottomAlign = bottomAlign;
    }

    public OnDragViewClickListener getOnDragViewClickListener() {
        return onDragViewClickListener;
    }

    public void setOnDragViewClickListener(OnDragViewClickListener onDragViewClickListener) {
        this.onDragViewClickListener = onDragViewClickListener;
    }


    public OnDragViewMoveListener getOnDragViewMoveListener() {
        return onDragViewMoveListener;
    }

    public void setOnDragViewMoveListener(OnDragViewMoveListener onDragViewMoveListener) {
        this.onDragViewMoveListener = onDragViewMoveListener;
    }

    public DragRelativeLayout(Context context) {
        this(context,null);
    }

    public DragRelativeLayout(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public DragRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setupStyleable(context,attrs);
        setFocusableInTouchMode(true);
        setClickable(true);
        setFocusable(true);
    }


    public void setupStyleable(Context context, AttributeSet attrs) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.DragView);

        leftAlign = typedArray.getBoolean(R.styleable.DragView_leftAlign,true);
        rightAlign = typedArray.getBoolean(R.styleable.DragView_rightAlign,true);
        topAlign = typedArray.getBoolean(R.styleable.DragView_topAlign,true);
        bottomAlign = typedArray.getBoolean(R.styleable.DragView_bottomAlign,true);

        alignDistance = typedArray.getDimension(R.styleable.DragView_alignDistance,defaultAlignDistance);

        typedArray.recycle();

    }

    protected float dp2px(float dp) {
        DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
        return Math.round(dp * (displayMetrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT));
    }

    private float oldX,oldY;

    private int pressCount = 0;

    @Override
//告知父控件不拦截事件
    public boolean dispatchTouchEvent(MotionEvent ev) {
        getParent().requestDisallowInterceptTouchEvent(true);
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                pressCount ++;
                oldX = event.getX();
                oldY = event.getY();
                return  super.onTouchEvent(event);
            case MotionEvent.ACTION_MOVE:
                pressCount ++;
                float distanceX =  event.getX() - oldX;
                float distanceY =  event.getY() - oldY;
                if (Math.abs(distanceX) >= 5 || Math.abs(distanceY) >= 5)
                {
                    l = (int) (getLeft() + distanceX);
                    t = (int) (getTop() + distanceY);
                    int r = l + getWidth();
                    int b = t + getHeight();

                    if (l <= 0){
                        l = 0;
                        r = getWidth();
                    } else if (r > ((ViewGroup)getParent()).getWidth()){
                        r = ((ViewGroup)getParent()).getWidth();
                        l = ((ViewGroup)getParent()).getWidth() - getWidth();
                    }
                    if (t <= 0){
                        t = 0;
                        b = getHeight();
                    }else if (b > ((ViewGroup)getParent()).getHeight()){
                        b = ((ViewGroup)getParent()).getHeight();
                        t = ((ViewGroup)getParent()).getHeight() - getHeight();
                    }
                    this.layout(l,t,r,b);
                }
                break;

            case MotionEvent.ACTION_UP:
                setL(getLeft());
                setT(getTop());

                if (pressCount == 1) {
                    if (this.onDragViewClickListener != null)
                        this.onDragViewClickListener.onDragViewClick(this);
                } else {
                    //响应滑动监听
                    if (this.onDragViewMoveListener != null)
                        this.onDragViewMoveListener.onDragViewMove(this);
                }
                pressCount = 0;
                //边缘吸附
//                if (getX() <= alignDistance) {
//                    if (leftAlign)
//                        this.layout(0, (int) getY(), getWidth(), (int) getY() + getHeight());
//                } else if (getX() + getWidth() >= ((ViewGroup)getParent()).getWidth() - alignDistance) {
//                    if (rightAlign)
//                        this.layout(((ViewGroup) getParent()).getWidth() - getWidth(), (int) getY(), ((ViewGroup) getParent()).getWidth(), (int) getY() + getHeight());
//                }
//                if (getY() <= alignDistance) {
//                    if (topAlign)
//                        this.layout((int) getX(), 0, (int) getX() + getWidth(), getHeight());
//                }
//                else if ( getY() + getHeight() >= ((ViewGroup)getParent()).getHeight() - alignDistance) {
//                    if (bottomAlign)
//                        this.layout((int) getX(), ((ViewGroup) getParent()).getHeight() - getHeight(), (int) getX() + getWidth(), ((ViewGroup) getParent()).getHeight());
//                }
                break;
        }
        return true;
    }
}

使用:

1.创建布局xml

<?xml version="1.0" encoding="utf-8"?>
<com.youjing.yingyudiandu.diandubook.widget.DragRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">


</com.youjing.yingyudiandu.diandubook.widget.DragRelativeLayout>

2.java中

RelativeLayout.LayoutParams layoutParams_move = new RelativeLayout.LayoutParams(w, h);
DragRelativeLayout rl_kuang_move = (DragRelativeLayout) inflater.inflate(R.layout.kuang_move, rl_util_move, false);

//可在DragRelativeLayout 中自定义需要携带的数据
rl_kuang_move.setIndex(i);
rl_kuang_move.setPartBean(partBean);


//设置点击和拖动监听
rl_kuang_move.setOnDragViewMoveListener(new DragRelativeLayout.OnDragViewMoveListener() {
                @Override
                public void onDragViewMove(View view) {
                    
                }
            });

            rl_kuang_move.setOnDragViewClickListener(new DragRelativeLayout.OnDragViewClickListener() {
                @Override
                public void onDragViewClick(View view) {
                    
                }
            });

layoutParams_move.setMargins(left, top, 0, 0);
rl_kuang_move.setLayoutParams(layoutParams_move);
//设置框的背景
rl_kuang_move.setBackgroundColor(Color.BLUE);

//将rl_kuang_move放置在父布局rl_kuang_move上
rl_util_move.addView(rl_kuang_move);
rl_kuang_move.bringToFront();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值