我是一个初学者,想知道在回收器列表视图中,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的一部分:
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
。因此,对我来说,采用这个解决方案会容易得多,但这个公认的答案让我感到不确定。请告诉我:哪一个性能最好?
发布于 2019-08-04 11:41:29
我有一个更好的方法来切换图像(只有2个状态)。
创建一个可绘制的,假设是favourite.xml
<?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
的位置,将其替换为以下内容:
<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" />
你就完事了!
这基本上将默认的复选框可绘制更改为您的自定义可绘制,这样您就有了两个状态。
编辑:您可以将任何动画附加到复选框中,我使用的是:
在res/anim下添加名为scale.xml
的文件:
<?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>
然后在你的活动中:
private lateinit var mAnimation: Animation
mAnimation = AnimationUtils.loadAnimation(this, R.anim.scale)
checkbox.setOnClickListener {
it.startAnimation(mAnimation)
}
这就对了。
https://stackoverflow.com/questions/57343237
复制相似问题