在 Recycler 列表视图中 ImageButton 的两种外观之间切换的最佳实践:setImageBitmap vs setImageResource vs setImageDrawable
Best practice for changing between two appearances of an ImageButton in Recycler List View: setImageBitmap vs setImageResource vs setImageDrawable
我是初学者,想知道 setImageBitmap 与 setImageResource 与 setImageDrawable 中的哪一个是在 Recycler 列表视图中的 ImageButton 的两种外观(状态)之间切换的最佳实践。就像 Android 的 AlarmClock 中的时钟符号一样,它有 2 种不同的状态并且位于 RecyclerView 中:
我需要 10 个声望才能 post 图片,所以这是一个带有警报列表图片的网站:https://www.pctipp.ch/androidtipp/artikel/android-coole-wecker-features-in-samsung-und-aehnlichen-smartphones-81200/
我已经为类似案例找到了可接受的答案:setImageResource Vs setDrawable
它说 setImageResource 可能是最糟糕的解决方案,但如果我采用其他解决方案,我的 ImageButton 就会出现问题,例如它会失去原来的大小。更重要的是,它看起来还需要做更多,例如 "decodeResource"。我认为这对它的性能不利,因为它对每一行都执行。
我知道 setImageDrawable 总是在 setImageBitmap 时被调用,所以我认为 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
。因此,采用这种解决方案对我来说会容易得多,但接受的答案让我不确定。请告诉我:哪一个性能最好?
我有一个更好的方法来切换图像(仅适用于 2 个州)。
创建一个 drawable 比方说 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" />
大功告成!
这基本上将默认的复选框可绘制对象更改为您的自定义可绘制对象,并且您有 2 个状态。
checkbox.isChecked
!checkbox.isChecked
编辑:
您可以将任何动画附加到复选框,我使用的是:
在 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>
然后在你的 activity:
private lateinit var mAnimation: Animation
mAnimation = AnimationUtils.loadAnimation(this, R.anim.scale)
checkbox.setOnClickListener {
it.startAnimation(mAnimation)
}
好了。
我是初学者,想知道 setImageBitmap 与 setImageResource 与 setImageDrawable 中的哪一个是在 Recycler 列表视图中的 ImageButton 的两种外观(状态)之间切换的最佳实践。就像 Android 的 AlarmClock 中的时钟符号一样,它有 2 种不同的状态并且位于 RecyclerView 中: 我需要 10 个声望才能 post 图片,所以这是一个带有警报列表图片的网站:https://www.pctipp.ch/androidtipp/artikel/android-coole-wecker-features-in-samsung-und-aehnlichen-smartphones-81200/
我已经为类似案例找到了可接受的答案:setImageResource Vs setDrawable 它说 setImageResource 可能是最糟糕的解决方案,但如果我采用其他解决方案,我的 ImageButton 就会出现问题,例如它会失去原来的大小。更重要的是,它看起来还需要做更多,例如 "decodeResource"。我认为这对它的性能不利,因为它对每一行都执行。 我知道 setImageDrawable 总是在 setImageBitmap 时被调用,所以我认为 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
。因此,采用这种解决方案对我来说会容易得多,但接受的答案让我不确定。请告诉我:哪一个性能最好?
我有一个更好的方法来切换图像(仅适用于 2 个州)。
创建一个 drawable 比方说 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" />
大功告成!
这基本上将默认的复选框可绘制对象更改为您的自定义可绘制对象,并且您有 2 个状态。
checkbox.isChecked
!checkbox.isChecked
编辑: 您可以将任何动画附加到复选框,我使用的是:
在 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>
然后在你的 activity:
private lateinit var mAnimation: Animation
mAnimation = AnimationUtils.loadAnimation(this, R.anim.scale)
checkbox.setOnClickListener {
it.startAnimation(mAnimation)
}
好了。