Android 中自定義組件例子一(中級)

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);//兩者取小

}

}

};

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章