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();