笔者在做一个项目中遇到的一个小阻碍,于是就实现了这个ImageVIEw达到开发需求
情景需求 > 点击实现图片的切换
可能有人会说了,这还不简单?为ImageVIEw设置点击事件,然后通过重写的onClick(VIEw v)方法判断定义的某一个flag进行图片的切换,伪代码如下:
private boolean flag;public voID onClick(VIEw v){ if(flag){ mImageVIEw.setimageResource(R.drawable.xx1); }else{ mImageVIEw.setimageResource(R.drawable.xx2); } flag = !flag;}
笔者连上面的代码知道写出来那为什么还要去自定义一个ImageVIEw了?
具体需求:两个ImageVIEw之间实现单选效果
我们试想下,目前两个ImageVIEw通过上面的代码可能还好,只要在不同的事件中做出不同的判断就好了,但如果一但ImageVIEw增多了了?
A:你不知道用 RadioGroup+Radiobutton 啊!
B:是哦!我现在去试下。
……
B:不行啊,虽然Radiobutton可以实现,但不好做适配,我为Radiobutton设置Drawable,不能居中,而且不能随着Radiobutton的大小改变而改变,资源图片是多大就多大,显示区域不够就不能完全显示出来。
A:…?,额,是吗?这样啊!那我们就自定义一个ImageVIEw来实现吧!
B:为什么是自定义ImageVIEw?而不是自定义Radiobutton?
A:自定义Radiobutton实现ImageVIEw的src属性比较复杂(等着正在看这博客的大神实现),而自定义ImageVIEw来实现单选的属性比较好实现。
B:那怎么实现了?
A:看代码,代码如下:
attrs.xml <为自定义ImageVIEw添加两个属性>
<?xml version="1.0" enCoding="utf-8"?><resources><declare-styleable name="SelectorImageVIEw"> <attr name="selector_src" format="reference"/>//选中的src图片属性 <attr name="checked" format="boolean"/></declare-styleable></resources>
Class - SelectorImageVIEw<此类实现了Checkable接口,这里没什么特殊功能,而只是利用此接口中的方法而已,不实现我们也可以自己写>
public class SelectorImageVIEw extends ImageVIEw implements Checkable { private boolean isChecked; private Drawable mSelectorDrawable; private Drawable mDrawable; public SelectorImageVIEw(Context context) { this(context,null); } public SelectorImageVIEw(Context context,AttributeSet attrs) { this(context,attrs,0); } public SelectorImageVIEw(Context context,AttributeSet attrs,int defStyleAttr) { super(context,defStyleAttr); /**获取默认属性src的Drawable并用成员变量保存*/ mDrawable = getDrawable(); final TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.SelectorImageVIEw); /**获取自定义属性selector_src的Drawable并用成员变量保存*/ Drawable d = a.getDrawable(R.styleable.SelectorImageVIEw_selector_src); mSelectorDrawable = d; /**获取自定义属性checked的值并用成员变量保存*/ isChecked = a.getBoolean(R.styleable.SelectorImageVIEw_checked,false); setChecked(isChecked); if (d != null && isChecked) { /**如果在布局中设置了selector_src与checked = true,我们就要设置ImageVIEw的图片为mSelectorDrawable */ setimageDrawable(d); } a.recycle(); } @OverrIDe public voID setimageDrawable(Drawable drawable) { super.setimageDrawable(drawable); } @OverrIDe public voID setChecked(boolean checked) { this.isChecked = checked; } @OverrIDe public boolean isChecked() { return isChecked; } @OverrIDe public voID toggle() { /**此处依据是否选中来设置不同的图片*/ if (isChecked()) { setimageDrawable(mSelectorDrawable); } else { setimageDrawable(mDrawable); } } public voID toggle(boolean checked){ /**外部通过调用此方法传入checked参数,然后把值传入给setChecked()方法改变当前的选中状态*/ setChecked(checked); toggle(); }}
layout.xml
<linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:app="http://schemas.androID.com/apk/res-auto" androID:layout_wIDth="match_parent" androID:layout_height="match_parent"> <com.qjay.adf.Widget.SelectorImageVIEw androID:ID="@+ID/iv" androID:layout_wIDth="100dp" androID:layout_height="100dp" app:selector_src="@mipmap/checked" androID:src="@mipmap/no_checked"/></linearLayout>
Activity Code
public class MainActivity extends Activity { private SelectorImageVIEw iv; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); iv = (SelectorImageVIEw) findVIEwByID(R.ID.iv); iv.setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { iv.toggle(!iv.isChecked()); } }); }}
实现效果
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的Android自定义ImageView实现点击两张图片切换效果全部内容,希望文章能够帮你解决Android自定义ImageView实现点击两张图片切换效果所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)