您的位置:首页 > 其它

自定义View的状态 (Checkable接口引发的联想)

2015-12-18 15:05 459 查看
SDK Samples 里有个CustomChoiceList 工程 里面对checkable接口进行了实现

##自定义了 view的三种状态,并让selector跟着状态切换图片

效果:



public class ThreeStateImageView extends ImageView  {
private STATE currentState;
enum STATE{
ONE,TWO,THREE
}

private static final int[] ONESTATE={R.attr.onestate};
private static final int[] TWOSTATE={R.attr.twostate};
private static final  int[] THREESTATE={R.attr.threestate};

public ThreeStateImageView(Context context) {
super(context);
}

public ThreeStateImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public ThreeStateImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

public void setState(STATE currentState){
this.currentState=currentState;
refreshDrawableState();
}

public void toggle(){
switch (currentState){
case ONE:
setState(STATE.TWO);
break;
case TWO:
setState(STATE.THREE);
break;
case THREE:
setState(STATE.ONE);
break;
}
}

@Override
public int[] onCreateDrawableState(int extraSpace) {
int[] stateSets= super.onCreateDrawableState(extraSpace+1);
if(currentState==null){
currentState=STATE.ONE;
}
switch (currentState){
case ONE:
mergeDrawableStates(stateSets,ONESTATE);
break;
case TWO:
mergeDrawableStates(stateSets,TWOSTATE);
break;
case THREE:
mergeDrawableStates(stateSets,THREESTATE);
break;
}
return stateSets;
}
}


follow_state_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:my="http://schemas.android.com/apk/res-auto">
<item android:drawable="@drawable/video_unfollowed" my:onestate="true" />
<item android:drawable="@drawable/video_followed" my:twostate="true" />
<item android:drawable="@drawable/video_followedeach" my:threestate="true" />
</selector>


attrs.xml

<declare-styleable name="ThreeState">
<attr name="onestate" format="boolean" />
<attr name="twostate" format="boolean" />
<attr name="threestate" format="boolean" />
</declare-styleable>


下面 使用

xml

<你的包名.ThreeStateImageView
android:id="@+id/video_live_addfollow"
android:layout_width="24dp"
android:layout_marginRight="10dp"
android:layout_height="24dp"
android:src="@drawable/followstate_selector" />


ThreeStateImageView     addFollow = (ThreeStateImageView) view.findViewById(R.id.video_live_addfollow);
addFollow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addFollow.toggle();
}
});


ps:1.你可以重写view的performClick可以实现自动切换

@Override
public boolean performClick() {
toggle();
return super.performClick();
}


2.也可以写个接口监听STATE的状态的改变,这里就不写了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: