• Android中的自定义属性的实现


    Android开发中,如果系统提供的View组件不能满足我们的需求,我们就需要自定义自己的View,此时我们会想可不可以为自定义的View定义属性呢?答案是肯定的。我们可以定义自己的属性,然后像系统属性一样用在layout布局中。

    通过下面3步既可以完成自定义属性:

    第一步:在values文件夹下的attrs.xml文件(如果没有可以收到建立)中定义属性资源文件

    1 <?xml version="1.0" encoding="utf-8"?>
    2 <resources>
    3 
    4     <declare-styleable name="AlphaImageView">
    5         <attr name="myduration" format="integer"></attr>
    6     </declare-styleable>
    7 
    8 </resources>

    其中declare-styleable标签中定义的是自定义的属性名和属性值的格式,此处是myduration,值是整型。

    第二步:在布局文件中使用自定义属性,并为其赋值

     1 <RelativeLayout 
     2     xmlns:android="http://schemas.android.com/apk/res/android"
     3     xmlns:my="http://schemas.android.com/apk/res/com.example.attrrestest"
     4     android:layout_width="match_parent"
     5     android:layout_height="match_parent"
     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 
    11     <com.example.attrrestest.AlphaImageView
    12         android:id="@+id/imageView1"
    13         android:layout_width="fill_parent"
    14         android:layout_height="fill_parent"
    15         android:src="@drawable/abc_cab_background_top_holo_dark"
    16         my:myduration="60000" />
    17 
    18 </RelativeLayout>

    其中第11行是我自定义的一个View(代码在下面),在这个view中(16行)用到了第一步定义的属性myduration,并为他赋值为60000。需要注意的是系统属性的前缀用的是“android:”,而自定义属性的前缀是“my:”,这个前缀是在第3行需要我们手动引入的:“xmlns:my="http://schemas.android.com/apk/res/com.example.attrrestest”,“http://schemas.android.com/apk/res/”部分是固定不变的,后面加上应用的包名,我这里的包名是“com.example.attrrestest”。

    第三步:在自定义的view中获取我们定义的属性值。

     1 public class AlphaImageView extends ImageView {
     2     int alphaDelta = 0;// 透明度每次改变的大小
     3     int curAlpha = 0;// 当前透明度的大小
     4     int speed = 300; // 300毫秒改变一次
     5 
     6     Handler mHandler = new Handler() {
     7 
     8         @Override
     9         public void handleMessage(Message msg) {
    10             if (msg.what == 0x123) {
    11 
    12                 curAlpha += alphaDelta;
    13                 if (curAlpha > 255) {
    14                     curAlpha = 255;
    15                 }
    16                 setAlpha(curAlpha);
    17             }
    18         }
    19     };
    20 
    21     public AlphaImageView(Context context, AttributeSet attrs) {
    22         super(context, attrs);
    23         TypedArray typedArray = getResources().obtainAttributes(attrs, R.styleable.AlphaImageView);// 获取自定义的属性集
    24         Integer duration = typedArray.getInteger(R.styleable.AlphaImageView_myduration, 1);// 从属性集中获取需要的属性的值,该值由xml赋值
    25         alphaDelta = 255 * speed / duration;
    26 
    27     }
    28 
    29     @Override
    30     protected void onDraw(Canvas canvas) {
    31         setAlpha(curAlpha);//开始为透明,放在显示之前执行
    32         super.onDraw(canvas);
    33         
    34         final Timer timer = new Timer();
    35         timer.schedule(new TimerTask() {
    36 
    37             @Override
    38             public void run() {
    39                 if (curAlpha <= 255) {
    40                     mHandler.sendEmptyMessage(0x123);
    41                 } else {
    42                     timer.cancel();
    43                 }
    44 
    45             }
    46         }, 0, speed);
    47     }
    48 
    49 }

    此处我定义了一个view名称为AlphaImageView 继承于系统的ImageView,在代码的23,24行是获取第二步中我们给自定义属性赋的值,获取到值后就可以用来控制view变化了。

     

  • 相关阅读:
    SI与EMI(一)
    设计上如何避免EMC问题
    EMC与地之重新认识地
    EMC学习之电磁辐射
    围殴拓扑和端接之终结篇
    T型及Fly_by拓扑之应用总结
    拓扑结构介绍及其种类
    [转]Verilog综合时wire和reg如何防止被优化
    Verilog基础知识0(`define、parameter、localparam三者的区别及举例)
    [转]jumbo frame介绍
  • 原文地址:https://www.cnblogs.com/csxcode/p/4170607.html
Copyright © 2020-2023  润新知