用xml资源文件自定义属性

前端之家收集整理的这篇文章主要介绍了用xml资源文件自定义属性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在android中,我们经常会在java代码中,或者在xml界面布局代码中使用我们的自定义控件。开发者可以通过自定义自己的控件时继承Android系统提供的view组件,就可以像在使用Android系统提供的view组件时一样,用一些系统中控件的属性来很好地控制View组件中的外观行为。但其实,我们也可以通过自定义自己的控件的属性值,来扩展自定义属性,继而获得更好的外观控件或者其他的功能
比如,我们可以通过在应用中添加一个组件属性
duration来达到控制图片从不透明到透明的效果。接下来就让我们来看看效果吧。

第一步,我们可以在/res/values目录下属性资源文件attrs.xml,属性资源文件的根元素也是 < resources…/>元素,该元素有两个子元素
attr:定义一个属性
declare-styleable:定义一个styleable对象,每个styleable对象就 是一组attr属性的集合。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <!--定义一个属性-->
  4. <attr name="duration"></attr>
  5. <!--定义一个包含多个属性的styleabe对象-->
  6. <declare-styleable name="MyImageView">
  7. <attr name="duration"/>
  8. </declare-styleable>
  9. </resources>

现在就定义了一个名字叫MyImageView的属性组,里面含有一个叫duration的属性。而属性有什么效果,则就看自定义的控件里面是怎么使用它的了。
而上面也有一个等价的写法,就是

  1. <declare-styleable name="MyImageView">
  2. <attr name="duration" format="integer"/>
  3. </declare-tyleable>

接下来就是定义自己的控件 MyImageView

  1. public class MyImageView extends ImageView {
  2. //图片透明度每次改变的大小
  3. private int alphaDelta = 0;
  4. //记录图片当前的透明度
  5. private int curAlpha = 0;
  6. //每隔多少毫秒透明度改变一次
  7. private final int SPEED = 300;
  8.  
  9. public MyImageView(Context context,AttributeSet attrs) {
  10. super(context,attrs);
  11. TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.AlphaImageView);
  12. //获取duration参数
  13. int duration = typedArray.getInt(R.styleable.AlphaImageView_duration,0);
  14. //计算图片透明度每次改变的大小
  15. alphaDelta = 255 * SPEED / duration;
  16. }
  17.  
  18. @Override
  19. protected void onDraw(Canvas canvas) {
  20. this.setImageAlpha(curAlpha);
  21. this.setImageAlpha(curAlpha);
  22. super.onDraw(canvas);
  23. final Timer timer = new Timer();
  24. //按固定间隔发送消息,通知系统改变图片的透明度
  25. timer.schedule(new TimerTask() {
  26. @Override
  27. public void run() {
  28. Message msg = new Message();
  29. msg.what = 0x123;
  30. if (curAlpha >= 255) {
  31. timer.cancel();
  32. } else {
  33. handler.sendMessage(msg);
  34. }
  35. }
  36. },0,SPEED);
  37. }
  38.  
  39. Handler handler = new Handler() {
  40. @Override
  41. public void handleMessage(Message message) {
  42. if (message.what == 0x123) {
  43. //每次增加curAlpha的值
  44. curAlpha += alphaDelta;
  45. if (curAlpha > 255) {
  46. curAlpha = 255;
  47. }
  48. MyImageView.this.setAlpha(curAlpha);
  49. }
  50. }
  51. };
  52. }

最后,我们就在main_activity.xml文件中引用我们自己定义的控件与属性了。

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:mydef="http://schemas.android.com/apk/res/自己的包名"
  2. xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
  3. android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
  4. android:paddingRight="@dimen/activity_horizontal_margin"
  5. android:paddingTop="@dimen/activity_vertical_margin"
  6. android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
  7.  
  8. <com.自己的包名.MyImageView
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content"
  11. android:src="@mipmap/ic_launcher"
  12. mydef:duration="30000"
  13. />
  14. </RelativeLayout>

在android studio中,由于应用是采用gradle来构造的,所以也可以直接用这个来替代上面的,AS会自己寻找相应的适合的路径的。 xmlns:mydef=”http://schemas.android.com.apk/res-auto” 包名就是你是你代码放的路径,举例说明 如 com.example.jinhom.attrdef

猜你在找的XML相关文章