自定义属性

作者:追风剑情 发布于:2016-5-10 13:39 分类:Android

一、创建res\values\attrs.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <declare-styleable name="CrossView">
  4. <attr name="android:color" />
  5. <attr name="rotation" format="string" />
  1.         <!-- 自定义枚举 -->
  2.         <attr name="enum_attr">
  3.             <enum name="value1" value="1" />
  4.             <enum name="value2" value="2" />
  5.         </attr>
  6.         
  7.         <!-- 自定义标识 -->
  8.         <attr name="flag_attr">
  9.             <flag name="flag1" value="0x01" />
  10.             <flag name="flag2" value="0x02" />
  11.         </attr>
  1. </declare-styleable>
  2. </resources>

declare-styleable中的name可以随便命名,通常用类名。

attr中的name为属性名,format为属性类型。如果name用android内置的属性名则不需要设置format。

提示:关于可能的属性格式类型没有真正的文档。最好的文档是android.R.styleable.attr.xml文件和android.content.res.TypedArray类的Android源代码。当前格式包括引用(reference)、字符串(string)、颜色(color)、尺寸(dimension)、布尔值(boolean)、整数(integer)、浮点数(float)、百分数(fraction)、枚举(enum)和标识(flag)。


二、创建自定义视图CrossView.java

  1. package com.test.androidtest;
  2.  
  3. import android.content.Context;
  4. import android.content.res.TypedArray;
  5. import android.graphics.Canvas;
  6. import android.graphics.Color;
  7. import android.graphics.Paint;
  8. import android.util.AttributeSet;
  9. import android.util.Log;
  10. import android.view.View;
  11.  
  12. public class CrossView extends View {
  13.  
  14. private Paint mPaint;
  15. private float[] mPoints = {0.5f, 0f, 0.5f, 1f,
  16. 0f, 0.5f, 1f, 0.5f};
  17. public CrossView(Context context) {
  18. super(context);
  19. }
  20. public CrossView(Context context, AttributeSet attrs) {
  21. super(context, attrs);
  22. //获取自定义属性
  23. TypedArray arr = getContext().obtainStyledAttributes(attrs, R.styleable.CrossView);
  24. int color = arr.getColor(R.styleable.CrossView_android_color, Color.WHITE);
  25. float rotation = arr.getFloat(R.styleable.CrossView_rotation, 0f);
  26. int enum_attr = arr.getInt(R.styleable.CrossView_enum_attr, 0);
  27. int flag_attr = arr.getInt(R.styleable.CrossView_flag_attr, 0);
  28.  
  29. Log.i("test", "color="+color+", rotation="+rotation + ", enum_attr="+enum_attr+", flag_attr="+flag_attr);
  30. mPaint = new Paint();
  31. mPaint.setAntiAlias(true); //设置抗锯齿
  32. mPaint.setColor(0xFFFFFFFF);//设置画笔颜色
  33. }
  34. public CrossView(Context context, AttributeSet attrs, int defStyle) {
  35. super(context, attrs, defStyle);
  36. }
  37.  
  38. /**
  39. * 所有的在画布上绘图的调用都应当受对应的save()和restore()的约束
  40. */
  41. @Override
  42. public void onDraw(Canvas canvas) {
  43. super.onDraw(canvas);
  44. canvas.save();
  45. //自定义代码
  46. int scale = getWidth();
  47. canvas.scale(scale, scale);
  48. canvas.drawLines(mPoints, mPaint);
  49. //end
  50. canvas.restore();
  51. }
  52. }


三、创建活动

res\layout\activity_cross.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:custom="http://schemas.android.com/apk/res/com.test.androidtest"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical" >
  7. <com.test.androidtest.CrossView android:id="@+id/crossView"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. custom:rotation="45"
  11. custom:enum_attr="value1"
  12. custom:flag_attr="flag1|flag2"
  13. android:color="#FFFF00"/>
  14. </LinearLayout>

注意:
自定义命名空间custorm可以任意命名。
xmlns:custom="http://schemas.android.com/apk/res/com.test.androidtest"中的com.test.androidtest为AndroidManifest.xml中的package。前面的http://schemas.android.com/apk/res/为固定值。

MainActivity.java

  1. package com.test.androidtest;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5.  
  6. public class MainActivity extends Activity {
  7.  
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_cross);
  12. }
  13. }


运行测试

LogCat日志

111111.png


2222.png

标签: Android

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号