自定义View的状态 (Checkable接口引发的联想)
2015-12-18 15:05
459 查看
SDK Samples 里有个CustomChoiceList 工程 里面对checkable接口进行了实现
##自定义了 view的三种状态,并让selector跟着状态切换图片
效果:
![](http://img.blog.csdn.net/20151219224959916)
follow_state_selector.xml
attrs.xml
下面 使用
xml
ps:1.你可以重写view的performClick可以实现自动切换
2.也可以写个接口监听STATE的状态的改变,这里就不写了。
##自定义了 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的状态的改变,这里就不写了。
相关文章推荐
- 测试本机JVM支持的最大内存
- Flatten Binary Tree to Linked List
- (一)常用的CSS命名规则
- 单一职责原则
- GOF提出的23种设计模式是哪些 设计模式有创建形、行为形、结构形三种类别 常用的Javascript中常用设计模式的其中17种 详解设计模式六大原则
- mac笔记本更新到10.11.2的时候会出现的一些问题
- 动态规划的基本概念和最优化原理
- linux下android开发环境
- 压缩文件ZipEntry中文乱码
- ICE中间件学习笔记 基础理论篇
- CAS (5) —— Nginx代理模式下浏览器访问CAS服务器配置详解
- Intent.ACTION_GET_CONTENT用法
- shell定时任务
- 读《疯狂Java讲义》笔记总结一
- 打包时出现No matching provisioning profile found错误的解决方法
- Ubuntu FTP 配置
- 单调队列
- 后期生成事件之拷贝生成后的dll
- 动态规划-多阶段决策问题
- macbook air 只安装win7系统