package text.com.gridlayoutdemo;
import android.animation.LayoutTransition;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.DragEvent;
import android.view.Gravity;
import android.view.View;
import android.widget.GridLayout;
import android.widget.TextView;
import java.util.List;
/**
* 定义出一个setitem方法动态传递标题数据
* 定义方法 setAllowDrag()控制是否可以拖拽
* Created by janzen on 2017/11/23.
*/
public class DrageGridiayout extends GridLayout {
private static final int columnCount = 4;
private boolean allowDrag;//是否可以拖拽
private Rect[] mRects;
private View dragedView;
public DrageGridiayout(Context context) {
this(context, null);
}
public DrageGridiayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public DrageGridiayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
// android:animateLayoutChanges="true"
// android:columnCount="4"
this.setColumnCount(columnCount);
this.setLayoutTransition(new LayoutTransition());
}
public void setItems(List<String> items) {
for (String item : items) {
addItem(item);
}
}
private void addItem(String item) {
TextView textView = newItemView();
textView.setText(item);
this.addView(textView);
}
private TextView newItemView() {
TextView textView = new TextView(getContext());
textView.setBackgroundResource(R.drawable.selector_tv_bg);
GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams();
int margin = 5;
layoutParams.width = getResources().getDisplayMetrics().widthPixels / 4 - 2 * margin;
layoutParams.height = GridLayout.LayoutParams.WRAP_CONTENT;
textView.setLayoutParams(layoutParams);
layoutParams.setMargins(margin, margin, margin, margin);
textView.setGravity(Gravity.CENTER);
if (this.allowDrag) {
textView.setOnLongClickListener(olcl);
}else {
textView.setOnLongClickListener(null);
}
return textView;
}
public void setAllowDrag(boolean allowDrag) {
this.allowDrag = allowDrag;
if (this.allowDrag) {
this.setOnDragListener(odl);
}
}
View.OnLongClickListener olcl = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
dragedView = view;
view.startDrag(null, new View.DragShadowBuilder(view), null, 0);
view.setEnabled(false);
return false;
}
};
View.OnDragListener odl = new View.OnDragListener() {
@Override
public boolean onDrag(View view, DragEvent dragEvent) {
switch (dragEvent.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
initRects();
break;
case DragEvent.ACTION_DRAG_LOCATION:
int touchIndex = getTouchIndex(dragEvent);
if (touchIndex > -1 && dragedView != null && dragedView != DrageGridiayout.this.getChildAt(touchIndex)) {
DrageGridiayout.this.removeView(dragedView);
DrageGridiayout.this.addView(dragedView, touchIndex);
}
break;
case DragEvent.ACTION_DRAG_ENDED:
if (dragedView != null)
dragedView.setEnabled(true);
break;
}
return true;
}
};
private void initRects() {
mRects = new Rect[this.getChildCount()];
for (int i = 0; i < this.getChildCount(); i++) {
View childView = this.getChildAt(i);
Rect rect = new Rect(childView.getLeft(), childView.getTop(), childView.getRight(), childView.getBottom());
mRects[i] = rect;
}
}
private int getTouchIndex(DragEvent dragEvent) {
for (int i = 0; i < mRects.length; i++) {
Rect rect = mRects[i];
if (rect.contains((int) dragEvent.getX(), (int) dragEvent.getY())) {
return i;
}
}
return -1;
}
}
网友评论