Android 自定义View 滑动标签_At_Swim






public class DragableGridLayout extends GridLayout implements View.OnLongClickListener,View.OnDragListener {

    private int columCount = 3;
    private int margin = 20;
    //设置被推拽的条目
    private View mDragView;
    //设置GridView 是否能推拽
    private boolean mIsDragable;

    public DragableGridLayout(Context context) {
        this(context,null);
    }

    public DragableGridLayout(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public DragableGridLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        //GridView 列数
        setColumnCount(columCount);
        //GridView 添加或者删除条目的过度动画
        setLayoutTransition(new LayoutTransition());
    }

    //向GridView添加 条目
    public void setItems(List<String>stringList){
        for(String str : stringList){
                addItems(str);
        }
    }

    public void addItems(String str) {


        TextView tv = new TextView(getContext());
        tv.setText(str);
        //设置文字居中
        tv.setGravity(Gravity.CENTER);
        //设置内边距
        tv.setPadding(0,10,0,10);
        GridLayout.LayoutParams params = new GridLayout.LayoutParams();
        //设置控件平均分配
        params.width = getResources().getDisplayMetrics().widthPixels / columCount - margin * 2;
        params.height = LayoutParams.WRAP_CONTENT;
        //
        params.setMargins(margin,10,margin,10);
        //设置给  TextView
        tv.setLayoutParams(params);
        //给文字设置边框
        tv.setBackgroundResource(R.drawable.biankuang2);
        //添加到View
        addView(tv);

        if(mIsDragable){
            // 监听
            tv.setOnLongClickListener(this);
        }else{
            // 不监听
            tv.setOnLongClickListener(null);
        }

        if(mIsDragable){
            tv.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    //可拖拽的GridLayout 就删除条目,不可推拽的GridLayout 就添加删除的条目
                    if(mItemClickListenner != null){

                        mItemClickListenner.onDragItemClick(v);

                    }
                }
            });
        }else{
            tv.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    //不可拖拽的 GridLayout 就删除条目,可推拽的 GridLayout 就添加删除的条目
                    if(mItemClickListenner != null){
                        mItemClickListenner.onDisDragItemClick(v);
                    }
                }
            });
        }
    }


    private onItemClickListenner mItemClickListenner;
    //接口传值
    public interface onItemClickListenner{
        public void onDragItemClick(View view);

        public void onDisDragItemClick(View view);
    }

    public void setOnItemClickListenner(onItemClickListenner listenner){
        this.mItemClickListenner = listenner;
    }



    @Override
    public boolean onDrag(View v, DragEvent event) {
        switch (event.getAction()){
            case DragEvent.ACTION_DRAG_LOCATION:
                int itemIndex = getIndex(event);

                if (itemIndex > -1 && mDragView != null && mDragView != getChildAt(itemIndex)) {

                    removeView(mDragView);
                    addView(mDragView, itemIndex);
                }
                break;
                case DragEvent.ACTION_DRAG_STARTED:
                    initRects();
                    break;
        }
        return true;
    }

    //判断当前被拖拽的条目是否进入到了某个条目范围内,进入了就返回进入到的那个条目的索引值
    //没进入的话返回-1
    private int getIndex(DragEvent event) {
        for (int i = 0; i < rects.length; i++) {
            if (rects[i].contains((int) event.getX(), (int) event.getY())) {
                return i;
            }
        }
        return -1;
    }

    //将所有的条目都封装成矩形对象
    private Rect[] rects;

    private void initRects() {
        int childCount = getChildCount();
        rects = new Rect[childCount];
        for (int i = 0; i < childCount; i++) {
            View itemView = getChildAt(i);
            Rect rect = new Rect(itemView.getLeft(), itemView.getTop(),
                    itemView.getRight(), itemView.getBottom());
            rects[i] = rect;
        }
    }

    private boolean isPanDuan;
    public void setPanDuan(boolean isPanDuan){
        this.isPanDuan = isPanDuan;
    }
    @Override
    public boolean onLongClick(View v) {
        if(isPanDuan) {
            mDragView = v;
            //设置拖动监听
            v.startDrag(null, new DragShadowBuilder(v), null, 0);
        }
        return false;
    }

    public void setDragable(boolean isDragable){
        this.mIsDragable = isDragable;
        if(mIsDragable){
            setOnDragListener(this);
        }else{
            setOnDragListener(null);
        }
    }
}
在MainActivity中实现自定义的View
 private DragableGridLayout mDragLayout, mDisDragLayout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDragLayout = findViewById(R.id.drable_grid1);
        mDisDragLayout = findViewById(R.id.disdrable_grid1);
        initData();
    }


    private List<String> list1;
    private List<String> list2;


    private void initData() {
        mDragLayout.setDragable(true);
        list1 = new ArrayList<String>();
        list1.add("精选条目");
        list1.add("八达岭");
        list1.add("泰山");
        list1.add("黄山");
        list1.add("凤凰古城");
        list1.add("张家界");
        list1.add("峨眉山");
        mDragLayout.setItems(list1);

        mDisDragLayout.setDragable(false);
        list2 = new ArrayList<String>();
        list2.add("中央电视台");
        list2.add("嵩山少林寺");
        list2.add("天山");
        list2.add("长城");
        list2.add("龙虎山");
        list2.add("黄果树瀑布");
        list2.add("乐山");
        mDisDragLayout.setItems(list2);


        mDragLayout.setOnItemClickListenner(new DragableGridLayout.onItemClickListenner() {
            @Override
            public void onDragItemClick(View view) {
                if (view instanceof TextView) {
                    String text = ((TextView) view).getText().toString();
                    for (int i = 0; i < list1.size(); i++) {
                        if (list1.get(i).equals(text)) {
                            if (list1.size() > 4) {
                                mDragLayout.removeView(view);
                                list1.remove(i);
                                list2.add(text);
                                mDisDragLayout.addItems(text);
                            }
                        }
                    }
                }
            }
            @Override
            public void onDisDragItemClick(View view) {
            }
        });
        mDisDragLayout.setOnItemClickListenner(new DragableGridLayout.onItemClickListenner() {
            @Override
            public void onDragItemClick(View view) {
            }
            @Override
            public void onDisDragItemClick(View view) {
         
                if (view instanceof TextView) {
                    String text = ((TextView) view).getText().toString();
                    for (int i = 0; i < list2.size(); i++) {
                        if (list2.get(i).equals(text)) {
                            list1.add(text);
                            list2.remove(i);
                            mDisDragLayout.removeView(view);
                            mDragLayout.addItems(text);
                        }
                    }
                }
            }
        });

    }

实现这个功能遇到了很多问题

1.重复的条目

2.添加后无法刷新

3.数据不匹配

4.重复删除

在这里我们实现的是一个死的数据,下篇博客会上传一片完整的  TabLayout+ViewPager+自定义View+Fragment复用


猜你喜欢

转载自blog.csdn.net/At_Swim/article/details/79921743
今日推荐