自定义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);