Android開發(fā)自定義屬性

目的

掌握Android開發(fā)中最基礎(chǔ)的自定義屬性方法,自定義:PageController屬性,里面含有:mPadding屬性,resourceID屬性,numberOfPagese屬性

相關(guān)技術(shù)、及其使用

1、自定義屬性:
(1)、創(chuàng)建一個values資源文件
(2)、使用declare-styleable關(guān)鍵字修飾
(3)、name值為自己定義的類的類型
(4)、添加屬性 attr name 和對應(yīng)值的類型 format(如果有多個類型用 | 隔開) (自定義屬性在xml中使用)

自定義屬性:

<resources>
    <!--聲明在那個控件上添加屬性-->
    <declare-styleable name="PageController">
        <attr name="mPadding" format="integer"/>
        <attr name="resourceID" format="reference|color"/>
        <attr name="numberOfPages" format="integer"/>
    </declare-styleable>
</resources>

調(diào)用屬性:

<swu.ht.java.customattr.PageController
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:padding="20"
    app:numberOfPages="5"
    app:resourceID="@drawable/dot_shape"/>

2、創(chuàng)建PageController類繼承于LinearLayout,實現(xiàn)三個PageController方法
(1)創(chuàng)建私有變量:numberOfPage,resourceID,padding ,currentPage

 public PageController(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        setOrientation(LinearLayout.HORIZONTAL);
        setGravity(Gravity.CENTER);

        /*
            將xml里面自定義屬性的值取出來
         */
        if(attrs != null){
            /*從一個資源文件里面去將自定義的所有屬性取出來
                1、AttributeSet xml里面配制的所有屬性
                2、自定義的屬性文件 R.styleable.name
            */
           TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.PageController);
            /* 需要傳參數(shù)
                   1、自定義屬性名 自定義屬性name_屬性名
                   2、默認值(xml 文件里面沒有設(shè)置就默認)
             */
           padding = typedArray.getInt(R.styleable.PageController_mPadding,0);
           resourceID = typedArray.getResourceId(R.styleable.PageController_resourceID,0);
           int page = typedArray.getInt(R.styleable.PageController_numberOfPages,0);

           //顯示
            setNumberOfPages(page);
        }
    }

(2)調(diào)用setNumberOfPage方法

  public void setNumberOfPages(int numberOfPages) {
        this.numberOfPages = numberOfPages;

        //創(chuàng)建點
        for(int i = 0; i < numberOfPages;i++){
            //創(chuàng)建控件ImageView
            ImageView dotView = new ImageView(getContext());
            //設(shè)置顯示的內(nèi)容
            dotView.setBackgroundResource(resourceID);
            //設(shè)置約束
            LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            params.gravity = Gravity.CENTER_VERTICAL;

            //除第一個點外,依次給后面的點之間添加間距
            if(i > 0 ){
                params.leftMargin = padding;
            }else {
                //默認選擇第一個點
                dotView.setEnabled(false);
            }
            //添加到容器中
            addView(dotView,params);
        }
    }

(3)調(diào)用onTouchEvent方法實現(xiàn)觸摸事件

 @Override
    public boolean onTouchEvent(MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN){
            //取出當前頁數(shù)
            int current = currentPage;
            //實現(xiàn)左右點擊切換
            if(event.getX() > getWidth()*0.5){
                //右邊
               if(current == numberOfPages-1){
                   current = 0;
               }else {
                   current++;
               }
            }else {
                //左邊
                if(current == 0){
                    current = numberOfPages-1;
                }else {
                    current--;
                }
            }
            setCurrentPage(current);
        }
        return true;
    }

(4)調(diào)用SetCurrentPage還原上一次的默認狀態(tài)

public void setCurrentPage(int currentPage) {
        //將上一次的還原為默認狀態(tài)
        ImageView old = (ImageView)getChildAt(this.currentPage);
        old.setEnabled(true);

        //將當前選中的設(shè)置為選中狀態(tài)
        ImageView current = (ImageView)getChildAt(this.currentPage);
        current.setEnabled(false);
        this.currentPage = currentPage;

        //將頁數(shù)改變的事件回調(diào)給監(jiān)聽者
        if(mpageChangeListener != null){
            mpageChangeListener.pageDidChanged(currentPage);
        }
        showAnimation(current);
    }

(5)定義接口監(jiān)聽指示器改變事件,并實現(xiàn)拉伸動畫

 public interface PageChangeListener{
        void pageDidChanged(int currentPage);
    }
    //mPageChangeListener
    //設(shè)置監(jiān)聽對象
    public void addPageChangeListener(PageChangeListener listener){
        this.mpageChangeListener = listener;
    }
    /*
        寬度拉伸的動畫
            關(guān)鍵幀動畫 補間動畫 屬性動畫(ObjectAnimator)
     */
    public void showAnimation(ImageView item){
        ObjectAnimator scale = ObjectAnimator.ofFloat(item,"scaleX",1,1.5f,1);
        scale.setDuration(400);
        scale.start();
    }

PS

自定義屬性主要就是在value里面定義屬性,然后在xml配置文件中進行調(diào)用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容