두 드로어 블을 비교하는 방법, 이렇게하고 있지만 성공하지 못했습니다
public void MyClick(View view)
{
Drawable fDraw = view.getBackground();
Drawable sDraw = getResources().getDrawable(R.drawable.twt_hover);
if(fDraw.equals(sDraw))
{
//Not coming
}
}
답변
https://stackoverflow.com/a/36373569/1835650 업데이트
getConstantState ()가 잘 작동하지 않습니다.
비교하는 또 다른 방법이 있습니다.
mRememberPwd.getDrawable().getConstantState().equals
(getResources().getDrawable(R.drawable.login_checked).getConstantState());
mRemeberPwd
은 ImageView
본 실시 예에서. 를 사용하는 TextView
경우 getBackground().getConstantState
대신 사용하십시오.
답변
getConstantState()
혼자 의지 하면 위음성 이 발생할 수 있습니다. .
내가 취한 접근 방식은 첫 번째 인스턴스에서 ConstantState를 비교하려고 시도하지만 해당 검사가 실패하면 Bitmap 비교로 돌아갑니다.
이것은 모든 경우 (리소스가 아닌 이미지 포함)에서 작동하지만 메모리가 부족하다는 점에 유의하십시오.
public static boolean areDrawablesIdentical(Drawable drawableA, Drawable drawableB) {
Drawable.ConstantState stateA = drawableA.getConstantState();
Drawable.ConstantState stateB = drawableB.getConstantState();
// If the constant state is identical, they are using the same drawable resource.
// However, the opposite is not necessarily true.
return (stateA != null && stateB != null && stateA.equals(stateB))
|| getBitmap(drawableA).sameAs(getBitmap(drawableB));
}
public static Bitmap getBitmap(Drawable drawable) {
Bitmap result;
if (drawable instanceof BitmapDrawable) {
result = ((BitmapDrawable) drawable).getBitmap();
} else {
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
// Some drawables have no intrinsic width - e.g. solid colours.
if (width <= 0) {
width = 1;
}
if (height <= 0) {
height = 1;
}
result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(result);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
}
return result;
}
답변
내 질문은 두 개의 드로어 블을 비교하는 것이었지만 두 드로어 블을 직접 비교하는 방법을 시도했지만 내 솔루션의 경우 드로어 블을 비트 맵으로 변경 한 다음 두 개의 비트 맵을 비교하면 작동합니다.
Bitmap bitmap = ((BitmapDrawable)fDraw).getBitmap();
Bitmap bitmap2 = ((BitmapDrawable)sDraw).getBitmap();
if(bitmap == bitmap2)
{
//Code blcok
}
답변
SDK 21 이상용
이것은 SDK -21에서 작동합니다.
mRememberPwd.getDrawable().getConstantState().equals
(getResources().getDrawable(R.drawable.login_checked).getConstantState())
SDK +21 android 5. 드로어 블 ID를 태그가있는 imageview로 설정
img.setTag(R.drawable.xxx);
이렇게 비교
if ((Integer) img.getTag() == R.drawable.xxx)
{
....your code
}
이 솔루션은의 drawable
ID를의 imageview
ID와 비교하려는 사람을위한 것 입니다 drawable.xxx
.
답변
Android 5 용 솔루션 :
if(image.getDrawable().getConstantState().equals(image.getContext().getDrawable(R.drawable.something).getConstantState()))
답변
getDrawable (int) 은 이제 사용되지 않습니다. 사용 getDrawable (문맥, R.drawable.yourimageid)
두 배경을 비교하려면
Boolean Condition1=v.getBackground().getConstantState().equals(
ContextCompat.getDrawable(getApplicationContext(),R.drawable.***).getConstantState());
답변
아마도 다음과 같이 시도하십시오.
public void MyClick(View view)
{
Drawable fDraw = view.getBackground();
Drawable sDraw = getResources().getDrawable(R.drawable.twt_hover);
if(fDraw.hashCode() == sDraw.hashCode())
{
//Not coming
}
}
또는 두 개의 드로어 블 인수를 취하고 부울을 반환하는 메서드를 준비합니다. 이 방법에서 드로어 블을 바이트로 변환하고 비교할 수 있습니다.
public boolean compareDrawable(Drawable d1, Drawable d2){
try{
Bitmap bitmap1 = ((BitmapDrawable)d1).getBitmap();
ByteArrayOutputStream stream1 = new ByteArrayOutputStream();
bitmap1.compress(Bitmap.CompressFormat.JPEG, 100, stream1);
stream1.flush();
byte[] bitmapdata1 = stream1.toByteArray();
stream1.close();
Bitmap bitmap2 = ((BitmapDrawable)d2).getBitmap();
ByteArrayOutputStream stream2 = new ByteArrayOutputStream();
bitmap2.compress(Bitmap.CompressFormat.JPEG, 100, stream2);
stream2.flush();
byte[] bitmapdata2 = stream2.toByteArray();
stream2.close();
return bitmapdata1.equals(bitmapdata2);
}
catch (Exception e) {
// TODO: handle exception
}
return false;
}