Android 自定義View(繼承原生元件)實現拖動移位效果
阿新 • • 發佈:2018-12-20
自定義View實現拖拽移位效果
通過繼承GridLayout實現的拖拽移位效果首先建立Class類繼承GridLayout並重寫前三個構造方法 public class MyGridlayout extends GridLayout implements View.OnLongClickListener { public MyGridlayout(Context context) { //此構造方法是通過new物件方式引用是 呼叫 super(context); } public MyGridlayout(Context context, AttributeSet attrs) { super(context, attrs,0); //在XML佈局檔案中引用時呼叫此構造 //此次是在XML檔案中引用此控制元件 所以要在這個方法中呼叫init方法 //此init()方法後面有詳細 init(); } public MyGridlayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }
下一步定義一行有幾個子元件
//一行幾條資料
private int mGridCount = 4;
private void init() {
//設施一行幾條資料
setColumnCount(mGridCount);
//新增建立動畫
setLayoutTransition(new LayoutTransition());
}
新增add方法
public void additems(List<String> list){ //可以通過此方法新增資料也可以呼叫 addStrtems(String item) 方法傳入字串值即可 for (String item: list){ addStrItems(item); } }
新增子控制元件方法
private int m=10; private void addStrItems(String item) { TextView textView = new TextView(getContext()); //將item 值設定給TextView textView.setText(item); //設定背景 textView.setBackgroundResource(R.drawable.item_jiahao_style); textView.setTextSize(20); //獲取管理器 GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams(); int i = getResources().getDisplayMetrics().widthPixels / mGridCount - (m + 3) * 2; textView.setWidth(i); layoutParams.setMargins(m+3,m+5,+3,+5); textView.setLayoutParams(layoutParams); textView.setPadding(m+5,m,m+5,m); textView.setGravity(Gravity.CENTER); //將TextView新增給GridLayout addView(textView); //設定長按時間 textView.setOnLongClickListener(this); }
長按事件
private View mDrageView;
//設定長安事件
@Override
public boolean onLongClick(View v) {
startDrag(null,new DragShadowBuilder(v),null,0);
this.mDrageView=v;
return true;
}
獲取監聽器
private boolean mDragAble;
//獲取監聽器
private OnDragListener listener=new OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
switch (event.getAction()){
case DragEvent.ACTION_DRAG_STARTED:
initRects();
break;
case DragEvent.ACTION_DRAG_LOCATION:
int i = dragChange(event);
if(i>-1 && mDrageView!=null && mDrageView!=getChildAt(i)){
removeView(v);
addView(mDrageView,i);
}
break;
}
return true;
}
};
最後在XML檔案中引用並findViewById 獲取控制元件並進行設定資料
final MyGridLayout myDragGridLayout = findViewById(R.id.my_gridlayout);
myDragGridLayout.setDragAble(true);
mDragList = new ArrayList<String>();
mDragList.add("國內");
mDragList.add("國際");
mDragList.add("社會");
mDragList.add("軍事");
mDragList.add("娛樂");
mDragList.add("科技");
mDragList.add("遊戲");
mDragList.add("體育");
mDragList.add("教育");
myDragGridLayout.addItems(mDragList);
final MyGridLayout myUnDragGridLayout = findViewById(R.id.my_undrage_gridlayout);
myUnDragGridLayout.setDragAble(false);
mUnDragList = new ArrayList<String>();
mUnDragList.add("搞笑");
mUnDragList.add("綜藝");
mUnDragList.add("獵奇");
mUnDragList.add("視訊");
mUnDragList.add("音樂");
mUnDragList.add("經濟");
mUnDragList.add("競技");
mUnDragList.add("財經");
mUnDragList.add("小說");
myUnDragGridLayout.addItems(mUnDragList);