至少在xml文件中写上上面的内容。其中com.example.xhelloworld.NewView这句是需要显示的控件所代表的类。Com.example.xhelloworld是类的包名,NewView是类名。这个类肯定是继承自View的自定义类(其实就是,使我们自己写的,这是废话了。。。),可以是在工程中直接源码添加xxxx.java的,也可以是在libs目录下自己新添加的jar包里面的。如果是jar包里面的一个类,则路径就是jar包里面,这个类的路径。
@H_403_50@ @Override @H_403_50@ publicvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
@H_403_50@ setContentView(R.layout.main);//setContentView(new MyView(this));
下面介绍如何实现自定义View的属性设置。实现自定义View的属性设置,需要:
·在values目录下建立attrs.xml文件,添加属性内容
·在布局文件中添加新的命名空间xmlns,然后可以使用命名空间给自定义的空间设置属性
·设置完属性之后,当然还要对其进行处理。在自定义View类中的构造方法中进行处理
根据这三步给一个例子进行说明一下
<?xml version="1.0" encoding="utf-8"?>
@H_403_50@ <resources> @H_403_50@ <declare-styleablename="MyView">attr"textColor"format="color"/>
"textSize""dimension"/>
@H_403_50@ </declare-styleable></resources>
然后在布局文件中完成:
xmlns:my=http://schemas.android.com/apk/res/com.example.xhelloworld
com.example.xhelloworld.MyView
@H_403_50@ android:layout_width="fill_parent"android:layout_height="wrap_content"
@H_403_50@ my:textColor="#FFFFFFFF"my:textSize="22dp"
/>
注:这步我在实现的时候出错,问题是显示找不到属性textColor和textSize,这奇怪的错误。解决方法是,在写my:textColor="#FFFFFFFF"时,写到my之后,按alt+/,这是会自动添加一个xmlns,和my的路径是一样的,用生成的这个替换掉my就可以了。奇葩的问题就用奇葩的方法解决。起初我也不知道怎么弄,瞎搞出来的。
最后在MyView.java中添加另一个构造方法,并添加代码来处理从xml中获得的属性
@H_403_50@ publicMyView(Context context,AttributeSet attrs){ @H_403_50@ super(context,attrs); @H_403_50@ mPaint=newPaint(); @H_403_50@ //TypedArray是一个用来存放由context.obtainStyledAttributes获得的属性的数组//在使用完成后,一定要调用recycle方法属性的名称是styleable中的名称+“_”+属性名称//TypedArray array = context.obtainStyledAttributes(attrs,R.styleable.MyView);
@H_403_50@ TypedArray array = context.obtainStyledAttributes(attrs,R.styleable.MyView); @H_403_50@ inttextColor = array.getColor(R.styleable.MyView_textColor,0XFF00FF00);提供默认值,放置未指定floattextSize = array.getDimension(R.styleable.MyView_textSize,36); @H_403_50@ mPaint.setColor(textColor);mPaint.setTextSize(textSize);
@H_403_50@ array.recycle();一定要调用,否则这次的设定会对下次的使用造成影响}
完成之后就已经实现了自定视图的构造,自定义视图属性的添加很处理。现在完成的是一般的自定义视图,继承自TextView或者View等视图,也就是通过程序主UI线程完成更新的视图,如果是自定义SurfaceView,实现方法有所不同。
添加完之后肯定有很多疑问,自己去做可能还不能理解。这里再对上面操作进行解释说明。
背后的事