1. 程式人生 > >Android 自定義View(繼承原生元件)實現拖動移位效果

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);