Android开发自定义属性

目的

掌握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配置文件中进行调用。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容