Android移植之自定义ProgressBar

昨天看了一下progressbar,今天总结一下。

ProgressBar这个类在/froyo/frameworks/base/core/java/android/widget/ProgressBar.java

当你去new一个ProgressBar的时候需要传进去参数,我们从这里看一下它执行的流程。

本篇的主要意图还是告诉你如何修改style去改变样式,如果你想diy自己的ProgressBar,相信对作移植的朋友有所帮助。

ProgressBar.java


    public ProgressBar(Context context, AttributeSet attrs) {
        this(context, attrs, com.android.internal.R.attr.progressBarStyle);

        //如果你只是给出ProgressBar的参数集,那么就会去找默认的那个progressBar的style;

        //我们就以默认的style作为示例,从这里去调下面的构造方法
     }

    public ProgressBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mUiThreadId = Thread.currentThread().getId();

        //这里不多说,我们需要UI线程才能画图
        initProgressBar();

        TypedArray a =
            context.obtainStyledAttributes(attrs, R.styleable.ProgressBar, defStyle, 0);
        //这里才是关键,通过传过来的defstyle的名字com.android.internal.R.attr.progressBarStyle找到themes.xml中的item

        //通过这个item的name去styles.xml中找相应的style,具体过程如下:

       

        //R.styleable.ProgressBar是声明参数列表和参数类型的,用于跟前面的attrs匹配,封装成TypedArray

        //这个过程在 /froyo/frameworks/base/core/java/android/content/Context.java

        //           /froyo/frameworks/base/core/java/android/content/res/Resource.java

        //里面可以找到。

        //下面就是初始化一些参数了,不必细述。

        ...
    }
attrs.xml  声明了ProgressBar这个styleable参数列表其他的widget下的公共控件也是如此。

             R.styleable.ProgressBar

   
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
           
           
           
           
       

       
       
       
       
       
   

themes.xml 定义了一些索引式的item,通过这些item可以找到相应的style,通过下面的红色部分可以去styles.xml中找对应的style

    
drawable/progress_medium_white.xml

    android:drawable="@drawable/spinner_white_48"
    android:pivotX="50%"
    android:pivotY="50%"
    android:framesCount="12"
    android:frameDuration="100" />

找到这里应该就可以结束本篇了。想要知道各种参数的意义,可以去api网站上查看。

你可能感兴趣的:(android)