比较android中的drawables imageButtons
Posted
技术标签:
【中文标题】比较android中的drawables imageButtons【英文标题】:Comparing drawables imageButtons in android 【发布时间】:2021-08-02 06:11:05 【问题描述】:我有 6 个带有可绘制对象的图像按钮,我正在尝试使用 getDrawable() 来比较它们。 这是我的xml代码
'''
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
tools:context=".TicTacToe">
<ImageButton
android:id="@+id/imageButton1"
android:layout_
android:layout_
android:layout_marginStart="25dp"
android:layout_marginTop="147dp"
android:layout_marginEnd="5dp"
android:layout_marginBottom="14dp"
android:onClick="change"
app:layout_constraintBottom_toTopOf="@+id/imageButton2"
app:layout_constraintEnd_toStartOf="@+id/imageButton01"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/blank" />
<ImageButton
android:id="@+id/imageButton01"
android:layout_
android:layout_
android:layout_marginTop="147dp"
android:layout_marginEnd="5dp"
android:layout_marginBottom="14dp"
android:onClick="change"
app:layout_constraintBottom_toTopOf="@+id/imageButton02"
app:layout_constraintEnd_toStartOf="@+id/imageButton001"
app:layout_constraintStart_toEndOf="@+id/imageButton1"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/blank" />
<ImageButton
android:id="@+id/imageButton2"
android:layout_
android:layout_
android:layout_marginStart="24dp"
android:layout_marginEnd="6dp"
android:layout_marginBottom="10dp"
android:onClick="change"
app:layout_constraintBottom_toTopOf="@+id/imageButton3"
app:layout_constraintEnd_toStartOf="@+id/imageButton02"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageButton1"
app:srcCompat="@drawable/blank" />
<ImageButton
android:id="@+id/imageButton001"
android:layout_
android:layout_
android:layout_marginTop="148dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="13dp"
android:onClick="change"
app:layout_constraintBottom_toTopOf="@+id/imageButton002"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/imageButton01"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/blank" />
<ImageButton
android:id="@+id/imageButton02"
android:layout_
android:layout_
android:layout_marginEnd="7dp"
android:layout_marginBottom="10dp"
android:onClick="change"
app:layout_constraintBottom_toTopOf="@+id/imageButton03"
app:layout_constraintEnd_toStartOf="@+id/imageButton002"
app:layout_constraintStart_toEndOf="@+id/imageButton2"
app:layout_constraintTop_toBottomOf="@+id/imageButton01"
app:srcCompat="@drawable/blank" />
<ImageButton
android:id="@+id/imageButton002"
android:layout_
android:layout_
android:layout_marginEnd="14dp"
android:layout_marginBottom="10dp"
android:onClick="change"
app:layout_constraintBottom_toTopOf="@+id/imageButton003"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/imageButton02"
app:layout_constraintTop_toBottomOf="@+id/imageButton001"
app:srcCompat="@drawable/blank" />
<ImageButton
android:id="@+id/imageButton3"
android:layout_
android:layout_
android:layout_marginStart="24dp"
android:layout_marginEnd="6dp"
android:layout_marginBottom="200dp"
android:onClick="change"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/imageButton03"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageButton2"
app:srcCompat="@drawable/blank" />
<ImageButton
android:id="@+id/imageButton03"
android:layout_
android:layout_
android:layout_marginEnd="7dp"
android:layout_marginBottom="200dp"
android:onClick="change"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/imageButton003"
app:layout_constraintStart_toEndOf="@+id/imageButton3"
app:layout_constraintTop_toBottomOf="@+id/imageButton02"
app:srcCompat="@drawable/blank" />
<ImageButton
android:id="@+id/imageButton003"
android:layout_
android:layout_
android:layout_marginEnd="14dp"
android:layout_marginBottom="200dp"
android:onClick="change"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/imageButton03"
app:layout_constraintTop_toBottomOf="@+id/imageButton002"
app:srcCompat="@drawable/blank" />
'''
kotlin 代码
'''
井字游戏类:AppCompatActivity()
var spot1: ImageButton? =null
var spot01: ImageButton? =null
var spot001: ImageButton? =null
var spot2: ImageButton? =null
var spot02: ImageButton? =null
var spot002: ImageButton? =null
var spot3: ImageButton? =null
var spot03: ImageButton? =null
var spot003: ImageButton? =null
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_tic_tac_toe)
spot1 = findViewById<ImageButton>(R.id.imageButton1)
spot01 = findViewById<ImageButton>(R.id.imageButton01)
spot001 = findViewById<ImageButton>(R.id.imageButton001)
spot2 = findViewById<ImageButton>(R.id.imageButton2)
spot02 = findViewById<ImageButton>(R.id.imageButton02)
spot002 = findViewById<ImageButton>(R.id.imageButton002)
spot3 = findViewById<ImageButton>(R.id.imageButton3)
spot03 = findViewById<ImageButton>(R.id.imageButton03)
spot003 = findViewById<ImageButton>(R.id.imageButton003)
val photos: IntArray= intArrayOf(R.drawable.x, R.drawable.o, R.drawable.blank)
var turn = 1
var winState = false
fun change(view: View)
var spot = findViewById<ImageButton>(view.getId()) //as Button
if(turn == 1)
spot.setImageResource(photos[0])
turn = turn * -1
else
spot.setImageResource(photos[1])
turn = turn * -1
if(spot1?.getDrawable() == spot01?.getDrawable() &&
spot1?.getDrawable() == spot001?.getDrawable() &&
spot1?.getDrawable() != photos[2].toDrawable())
winState = true;
Toast.makeText(getApplicationContext(),"Winner",Toast.LENGTH_SHORT).show();
'''
【问题讨论】:
我不认为你可以像这样比较Drawable
s,它们会返回不同的Drawable
对象,因此比较总是错误的。我要做的是使用ImageButton
和Drawable
字段创建一个类Spot
,并使用相同的Drawable
对象来初始化Spot
s,其Drawable
是相同的。然后比较这些字段;因为它们是用相同的对象初始化的,所以比较应该返回 true。
【参考方案1】:
Drawable 是一个对象,因此需要使用 equals() 方法进行比较。无论如何,我也不确定它是否会起作用,因为我不确定 Drawable 如何实现该方法,因此它可能不适合您的情况。
此外,您正在使用视图来检查业务逻辑的状态,这根本不理想。最好的解决方案是使用 Map 或矩阵(比方说,一个维度为 [3][3] 的数组),在其中存储单个点的实际值,然后将可绘制对象与值进行协调在矩阵中。
我知道这会影响您代码中的所有内容,您必须对其进行大量更改,因此更快的解决方案可能是在您的 ImageButtons 上使用 android:tag。您可以在其上指定任何 Object,因此您也可以使用和 Integer 并对其进行比较,始终使用 equals() 方法。这意味着您可以依赖标签来实现您的逻辑。
【讨论】:
以上是关于比较android中的drawables imageButtons的主要内容,如果未能解决你的问题,请参考以下文章
Android:实现保存assets图片(或res下的图片:R.drawable.image)到手机相册
android ImageLoader 混淆加载drawable出现黑色图片的解决方案
如何用getIdentifier获取android.R的ID,如android.R.drawable.ic_launcher