在android中比较2个ImageViews

时间:2014-02-13 09:59:51

标签: android drag-and-drop imageview compare

我目前正在开发一个Drag'n'Drop应用程序 我的应用有2种布局 第一种布局是2种不同颜色的球(图像) 第二种布局是3种不同颜色的球(图像) 当用户将一个球拖到任何布局上时将球放到另一个布局上,应用程序然后检查这个布局中是否有相同颜色的球:如果是,则删除那两个球,否则将球添加到该布局。

我的XML文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" 
    android:id="@+id/relative">

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="150sp"
        android:background="#00FF00"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ball_red" />

        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

            android:src="@drawable/ball_blue" />


        <ImageView
            android:id="@+id/imageView5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

            android:src="@drawable/ball_pink" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@id/linearLayout1"
        android:layout_centerHorizontal="true"
        android:background="#0F0F0F">

    <ImageView
        android:id="@+id/imageView6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:src="@drawable/ball_red" />
        <ImageView
        android:id="@+id/imageView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:src="@drawable/ball_yellow" />

    </LinearLayout>

</RelativeLayout>

我的活动类

public class MainActivity extends Activity implements OnTouchListener, OnDragListener{

    ImageView i1,i2,i3,i4,i5,i6;

    Drawable d1,d2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        i1=(ImageView) findViewById(R.id.imageView1);   i2=(ImageView) findViewById(R.id.imageView2);   
        i5=(ImageView) findViewById(R.id.imageView5);   i6=(ImageView) findViewById(R.id.imageView6);   i4=(ImageView) findViewById(R.id.imageView4);

        findViewById(R.id.linearLayout1).setOnDragListener(this);
        findViewById(R.id.linearLayout2).setOnDragListener(this);

        i6.setOnTouchListener(this);    i5.setOnTouchListener(this);    i2.setOnTouchListener(this);    i1.setOnTouchListener(this);
        i4.setOnTouchListener(this);

        d1=i1.getDrawable();    d2=i6.getDrawable();
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @SuppressLint("NewApi")
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
              DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
              v.startDrag(null, shadowBuilder, v, 0);
              v.setVisibility(View.VISIBLE);
              return true;
            }
            else {
                return false;
            }

    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @SuppressLint("NewApi")
    @Override
    public boolean onDrag(View v, DragEvent e) {
        // TODO Auto-generated method stub
        if (e.getAction()==DragEvent.ACTION_DROP) {
            View view = (View) e.getLocalState();
            ViewGroup from = (ViewGroup) view.getParent();
            from.removeView(view);
            LinearLayout to = (LinearLayout) v;

            boolean comp=false;
            comp=compareDrawable(d1, d2);;

            if(comp == false)
            {
            to.addView(view);
            view.setVisibility(View.VISIBLE);
            Toast.makeText(getApplicationContext(), "Add.", Toast.LENGTH_LONG ).show();
            }
            else
            {
                to.removeView(view);
                from.addView(view);
                view.setVisibility(View.INVISIBLE);
                Toast.makeText(getApplicationContext(), "Remove.", Toast.LENGTH_LONG ).show();
            }
        }
        return true;
    }


    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;
    }
}

Image 1

Image 2

Image 3

2 个答案:

答案 0 :(得分:2)

获取2张图片ID然后进行比较,

if(img1.getId()==img2.getId())
{
 //Your stuff
      }

或试试这个

 Bitmap bitmap = ((BitmapDrawable)img1).getBitmap();
    Bitmap bitmap2 = ((BitmapDrawable)img2).getBitmap();

      if(bitmap == bitmap2)
         {
    //Code blcok
           }

答案 1 :(得分:1)

我相信你真正需要的是比较两个位图是否是相同的内容 为此,您必须使用Bitmap.SameAs(位图)查看它here
作为建议,不要将对象与“==”进行比较,而是使用等于! PS:sameAs方法从API 12开始