Android 自定义View(继承原生组件)实现拖动移位效果

自定义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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值