美文网首页自定义控件
Android开发自定义属性

Android开发自定义属性

作者: 黑铁选手 | 来源:发表于2019-11-01 16:27 被阅读0次

    目的

    掌握Android开发中最基础的自定义属性方法,自定义:PageController属性,里面含有:mPadding属性,resourceID属性,numberOfPagese属性

    相关技术、及其使用

    1、自定义属性:
    (1)、创建一个values资源文件
    (2)、使用declare-styleable关键字修饰
    (3)、name值为自己定义的类的类型
    (4)、添加属性 attr name 和对应值的类型 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>
    

    调用属性:

    <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、创建PageController类继承于LinearLayout,实现三个PageController方法
    (1)创建私有变量: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);
                /* 需要传参数
                       1、自定义属性名 自定义属性name_属性名
                       2、默认值(xml 文件里面没有设置就默认)
                 */
               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)调用setNumberOfPage方法

      public void setNumberOfPages(int numberOfPages) {
            this.numberOfPages = numberOfPages;
    
            //创建点
            for(int i = 0; i < numberOfPages;i++){
                //创建控件ImageView
                ImageView dotView = new ImageView(getContext());
                //设置显示的内容
                dotView.setBackgroundResource(resourceID);
                //设置约束
                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)调用onTouchEvent方法实现触摸事件

     @Override
        public boolean onTouchEvent(MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_DOWN){
                //取出当前页数
                int current = currentPage;
                //实现左右点击切换
                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)调用SetCurrentPage还原上一次的默认状态

    public void setCurrentPage(int currentPage) {
            //将上一次的还原为默认状态
            ImageView old = (ImageView)getChildAt(this.currentPage);
            old.setEnabled(true);
    
            //将当前选中的设置为选中状态
            ImageView current = (ImageView)getChildAt(this.currentPage);
            current.setEnabled(false);
            this.currentPage = currentPage;
    
            //将页数改变的事件回调给监听者
            if(mpageChangeListener != null){
                mpageChangeListener.pageDidChanged(currentPage);
            }
            showAnimation(current);
        }
    

    (5)定义接口监听指示器改变事件,并实现拉伸动画

     public interface PageChangeListener{
            void pageDidChanged(int currentPage);
        }
        //mPageChangeListener
        //设置监听对象
        public void addPageChangeListener(PageChangeListener listener){
            this.mpageChangeListener = listener;
        }
        /*
            宽度拉伸的动画
                关键帧动画 补间动画 属性动画(ObjectAnimator)
         */
        public void showAnimation(ImageView item){
            ObjectAnimator scale = ObjectAnimator.ofFloat(item,"scaleX",1,1.5f,1);
            scale.setDuration(400);
            scale.start();
        }
    

    PS

    自定义属性主要就是在value里面定义属性,然后在xml配置文件中进行调用。

    相关文章

      网友评论

        本文标题:Android开发自定义属性

        本文链接:https://www.haomeiwen.com/subject/wjxqbctx.html