首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在回收器列表视图中更改ImageButton的两种外观的最佳实践: setImageBitmap vs setImageResource vs setImageDrawable

在回收器列表视图中更改ImageButton的两种外观的最佳实践: setImageBitmap vs setImageResource vs setImageDrawable
EN

Stack Overflow用户
提问于 2019-08-04 09:50:47
回答 1查看 82关注 0票数 -1

我是一个初学者,想知道在回收器列表视图中,setImageBitmap、setImageResource和setImageDrawable中的哪一个是在ImageButton的两个外观(状态)之间进行更改的最佳实践。就像安卓AlarmClock中的时钟符号一样,它有两种不同的状态,位于RecyclerView中:我需要10个声誉才能发布图像,所以这里有一个带有闹钟列表图片的网站:https://www.pctipp.ch/androidtipp/artikel/android-coole-wecker-features-in-samsung-und-aehnlichen-smartphones-81200/

对于类似的情况,我已经找到了一个公认的答案:setImageResource Vs setDrawable,它说setImageResource可能是最糟糕的解决方案,但如果我采用其他解决方案,比如我的ImageButton有问题,它就会失去原来的大小。更重要的是,它看起来还需要做更多的事情,比如"decodeResource“。我认为这对它的性能不好,因为它是针对每一行执行的。我知道setImageBitmap时总是会调用setImageDrawable,所以我认为setImageBitmap不是正确的答案。

这段代码是我的RecyclerView适配器中onBindViewHolder的一部分:

代码语言:javascript
复制
if (alarmAtPosition.isActive()){
    //Bitmap bm = BitmapFactory.decodeResource(Resources.getSystem(), R.drawable.ic_access_alarms_black_24dp);
    Drawable myDrawable = Resources.getSystem().getDrawable(R.drawable.ic_access_alarms_black_24dp);
    viewHolder.imageButton.setImageDrawable(myDrawable);
//viewHolder.imageButton.setImageResource(R.drawable.ic_access_alarms_black_24dp);
}
else {
    //Bitmap bm2 = BitmapFactory.decodeResource(Resources.getSystem(), R.drawable.ic_settings_black_24dp);
    Drawable myDrawable2 = Resources.getSystem().getDrawable(R.drawable.ic_settings_black_24dp);
    viewHolder.imageButton.setImageDrawable(myDrawable2);
//viewHolder.imageButton.setImageResource(R.drawable.ic_settings_black_24dp);
}

在我的row.xml中,如果我使用setImageResource,我不需要放android:src="@drawable/ic_settings_black_24dp。因此,对我来说,采用这个解决方案会容易得多,但这个公认的答案让我感到不确定。请告诉我:哪一个性能最好?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-04 11:41:29

我有一个更好的方法来切换图像(只有2个状态)。

创建一个可绘制的,假设是favourite.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_checked="true" android:drawable="@drawable/your_checked_drawable"/>
    <item android:drawable="@drawable/your_unchecked_drawable"/>

</selector>

现在,在添加了要更改其图像的imageButton的位置,将其替换为以下内容:

代码语言:javascript
复制
                <CheckBox
                    android:id="@+id/favourite"
                    android:button="@null"
                    android:checked="false"
                    android:clickable="true"
                    android:focusable="true"
                    android:background="@drawable/favourite"
                    android:layout_width="32dp"
                    android:layout_height="32dp" />

你就完事了!

这基本上将默认的复选框可绘制更改为您的自定义可绘制,这样您就有了两个状态。

  1. checkbox.isChecked
  2. !checkbox.isChecked

编辑:您可以将任何动画附加到复选框中,我使用的是:

在res/anim下添加名为scale.xml的文件:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <scale
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:toXScale="0.7"
        android:toYScale="0.7"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="200"
        android:repeatMode="reverse"
        android:repeatCount="1"/>

</set>

然后在你的活动中:

代码语言:javascript
复制
private lateinit var mAnimation: Animation
mAnimation = AnimationUtils.loadAnimation(this, R.anim.scale)
checkbox.setOnClickListener {
     it.startAnimation(mAnimation)
}

这就对了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57343237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档