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方法動態(tài)傳遞標題數(shù)據
* 定義方法 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;
}
}
自定義可拖拽GridLayout 類似于網易
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
相關閱讀更多精彩內容
- 如何通過自定義EditText來得到一個類似網易云音樂的帶有清除功能的搜索框 運行效果: 先上代碼,等會講解: 自...