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); 这里有引用
注释以及引用其他大手们的链接都在里面。感谢他们的帖子。 代码我已经加上注释