自定义控件,实现加载图片时透明变换

自定义控件,通常都是经过继承已有的view类,如TextView,Button。。。或者直接继承其父类View。此次由于要加载图片。因此继承自ImageView。而且实现了一个经过属性来控制的加载时间。首先是自定义的类


    
   
   
   
   
/** *知我者为我心忧,不知我者谓我何求! *linwoain@outlook.com *做者 linwoain *日期 2014/11/7 9:17 */package com.linwoain.TestAndroid.fragment;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.view.View;import android.widget.ImageView;import com.linwoain.TestAndroid.R;import java.util.Timer;import java.util.TimerTask;/** * 自定义控件,实现 * @author linwoain * @version 2014/11/7 9:17 */public class AlphaImageView extends ImageView { private static final int SPEED = 300;//每隔多少毫秒透明度改变一次 private int alphaDelta = 0;//图像透明度每次改变的大小 //记录图片当前的透明度 private int curAlpha = 0; Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 0x123) { curAlpha += alphaDelta; if (curAlpha > 255) { curAlpha = 255; AlphaImageView.this.setAlpha(curAlpha); } } } }; public AlphaImageView(Context context) { this(context, null); } public AlphaImageView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AlphaImageView); int duration = typedArray.getInt(R.styleable.AlphaImageView_duration, 0);//默认不透明 alphaDelta = 255 * SPEED / duration; typedArray.recycle(); } @Override protected void onDraw(Canvas canvas) { this.setAlpha(curAlpha); super.onDraw(canvas); final Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { Message message = new Message(); message.what = 0x123; if (curAlpha >= 255) { timer.cancel(); } else { handler.sendMessage(message); } } }, 0, SPEED); }}

这当中使用了属性 AlphaImageView_duration ,须要在values目录下新建attrs文件中声明,两种方式
一、不声明类型:
   
   
   
   
<?xml version="1.0" encoding="utf-8"?><resources> <attr name="duration"></attr> <declare-styleable name="AlphaImageView"> <attr name="duration"></attr> </declare-styleable></resources>

二、声明类型:
   
   
   
   
<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="AlphaImageView"> <attr name="duration" format="integer"></attr> </declare-styleable></resources>


第一种方式,有可能致使编译正确,但运行错误,第二种编译器会拒绝输入错误类型 。其中的 AlphaImageView 能够是非自定义控件的类名。而后在布局文件中添加一个AlphaImageView实例

   
   
   
   
<com.linwoain.TestAndroid.fragment.AlphaImageView app:duration="6000" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/gif"/>

注意,在布局文件中使用自定义控件的属性时,须要引入命名控件

   
   
   
   
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res/com.linwoain.TestAndroid" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" >
如上方所示,①的命名控件为安卓系统提供的控件的命名控件,②是自定义的命名控件,由 http://schemas.android.com/apk/res+应用的包名 共同构成!

此时就完成了一个自定义控件!!









相关文章
相关标签/搜索