Android 中自定義組件例子一(中級)
需求:實現點擊button時 按鈕顏色漸變效果 擡起時在顏色漸變回來
首先要準備幾張顏色不同的幾張.9圖片 如下圖(製作.9圖片這裏不做解釋 可以搜索一下)
截圖效果不是很明顯 顏色由紅 漸變成暗紅 大家可以意淫一下效果
前面的博文中詳細講解過自定義組件的步驟這裏就不做太多的解釋
上代碼
自定義的屬性
<declare-styleable name="Mybutton">
<attr name="transitionDrawable" format="reference" />
<attr name="transitionDrawableLength" format="integer"/>
</declare-styleable>
XML的佈局
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:sky="http://schemas.android.com/apk/res/com.zidingyi"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.zidingyi.Mybutton
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_width="128dp"
sky:transitionDrawable="@drawable/transition_list"
sky:transitionDrawableLength="8" >
</com.zidingyi.Mybutton2>
</LinearLayout>
放在drawable中的xml 層級 大家可以看做是幀動畫
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:maxLevel="0" android:drawable="@drawable/button_test0" />
<item android:maxLevel="1" android:drawable="@drawable/button_test1" />
<item android:maxLevel="2" android:drawable="@drawable/button_test2" />
<item android:maxLevel="3" android:drawable="@drawable/button_test3" />
<item android:maxLevel="4" android:drawable="@drawable/button_test4" />
<item android:maxLevel="5" android:drawable="@drawable/button_test5" />
<item android:maxLevel="6" android:drawable="@drawable/button_test6" />
<item android:maxLevel="7" android:drawable="@drawable/button_test7" />
</level-list>
下面核心代碼
public class Mybutton extends Button {
private LevelListDrawable mLevelListDrawable;
private int transitionDrawableLength ;
private int level;
//各種得到和設置
public Mybutton(Context context, AttributeSet attrs) {
super(context);
TypedArray a=context.obtainStyledAttributes(attrs,R.styleable.Mybutton);
mLevelListDrawable=(LevelListDrawable) a.getDrawable(R.styleable.Mybutton_transitionDrawable);
transitionDrawableLength=a.getInt(R.styleable.Mybutton_transitionDrawableLength, 0);
a.recycle();
level=0;
mLevelListDrawable.setLevel(level);
int paddingLeft=getPaddingLeft();
int paddingTop = getPaddingTop();
int paddingRight = getPaddingRight();
int paddingBottom = getPaddingBottom();
setBackgroundDrawable(mLevelListDrawable);
setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
}
//當點擊會自動回調的方法 通過此方法發送消息
@Override
protected void drawableStateChanged() {
// TODO Auto-generated method stub
super.drawableStateChanged();
int delta=isPressed()?1:-1;
handler.removeMessages(-delta);//移除上一個消息
handler.sendEmptyMessage(delta);//發送新消息
}
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
int what=msg.what;
level+=what;
if (level >= 0 && level < transitionDrawableLength) {
mLevelListDrawable.setLevel(level);
handler.sendEmptyMessageDelayed(what, 25);//循環發送消息 來達到顏色漸變的效果
} else {
level = Math.max(0, level);//兩者取大
level = Math.min(transitionDrawableLength-1, level);//兩者取小
}
}
};
}