Android之Android 自定义控件与属性


自定义控件



很多时候需要我们自己动手画出我们想要的控件,或者图形。有了他你会有更加开阔的UI设计.直接上代码



1、xml文件



[html]  view plain  copy


 


1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
2. xmlns:app="http://schemas.android.com/apk/res/com.mono.activity"  
3. android:layout_width="match_parent"  
4. android:layout_height="match_parent"  
5. android:orientation="vertical"  
6. android:paddingBottom="@dimen/activity_vertical_margin"  
7. android:paddingLeft="@dimen/activity_horizontal_margin"  
8. android:paddingRight="@dimen/activity_horizontal_margin"  
9. android:paddingTop="@dimen/activity_vertical_margin" >  
10. <!-- com.mono.activity" 应用的包名 -->  
11. <!-- http://schemas.android.com/apk/res/ 是固定的 -->  
12. <com.mono.activity.CustomImageView  
13. android:id="@+id/btntwo"  
14. android:layout_width="wrap_content"  
15. android:layout_height="wrap_content"  
16. android:src="@drawable/record_bg"  
17. app:roundHeight="10dp"  
18. app:roundWidth="10dp" />  
19. <ImageView  
20. android:layout_width="wrap_content"  
21. android:layout_height="wrap_content"  
22. android:layout_marginTop="10.0dp"  
23. android:src="@drawable/record_bg" />  
24. </LinearLayout>

 xmlns:app 的app是前缀


http://schemas.android.com/apk/res/  固定


com.mono.activity 应用的包名


这样你就可以往下继续了





2、 编写控件



[html]  view plain  copy


 

 
    
1. <com.mono.activity.CustomImageView  
2. android:id="@+id/btntwo"  
3. android:layout_width="wrap_content"  
4. android:layout_height="wrap_content"  
5. android:src="@drawable/record_bg"  
6. app:roundHeight="10dp"  
7. app:roundWidth="10dp" />  
 这是你自定义的控件,不用多说代码在CustomImageView.java里面


3、配置文件



[html]  view plain  copy


 

1. <?xml version="1.0" encoding="utf-8"?>  
2. <resources>  
3. <declare-styleable name="RoundAngleImageView">  
4. <attr name="roundWidth" format="dimension" />  
5. <attr name="roundHeight" format="dimension" />  
6. </declare-styleable>  
7.     <!--  
8. 属性  
9. reference  
10. string  
11. color  
12. dimension  
13. boolean  
14. integer  
15. float  
16. fraction  
17. enum  
18. flag  
19. format里面可以引用这些属性  
20. >  
21. </resources>



4、关键代码



[java]  view plain  copy


 


    1.     private void init(Context context, AttributeSet attrs) {  
    2. if (attrs != null) {  
    3. //AttributeSet是节点的属性集合  
    4. //TypedArray 属性的容器  
    5. //          getDimension()是基于当前DisplayMetrics进行转换,获取指定资源id对应的尺寸。文档里并没说这里返回的就是像素,要注意这个函数的返回值是float,像素肯定是int。  
    6. //          getDimensionPixelSize()与getDimension()功能类似,不同的是将结果转换为int,并且小数部分四舍五入。  
    7. //          getDimensionPixelOffset()与getDimension()功能类似,不同的是将结果转换为int,并且偏移转换(offset conversion,函数命名中的offset是这个意思)是直接截断小数位,即取整(其实就是把float强制转化为int,注意不是四舍五入哦)。  
    8.             TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.RoundAngleImageView);  
    9.             roundWidth = a.getDimensionPixelSize(R.styleable.RoundAngleImageView_roundWidth, roundWidth);  
    10.             roundHeight = a.getDimensionPixelSize(R.styleable.RoundAngleImageView_roundHeight, roundHeight);  
    11. //          typedArray.recycle();//为了保持以后使用该属性一致性  
    12. else {  
    13. float density = context.getResources().getDisplayMetrics().density;  
    14. int) (roundWidth * density);  
    15. int) (roundHeight * density);  
    16.         }  
    17. new Paint();  
    18.         paint.setColor(Color.BLUE);  
    19. true);  
    20. //PorterDuffXfermode 这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互  
    21. //  
    22. new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));  
    23. new Paint();  
    24. null);  
    25.     }



    配置文件   TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.RoundAngleImageView); 这里有引用


    注释以及引用其他大手们的链接都在里面。感谢他们的帖子。 代码我已经加上注释