Thomas Pen
Thomas Pen

Reputation: 77

how to switch images between imageviews in android?

I'm new to android and making a slide puzzle. I wanted to keep things simple by just swapping the images between imageviews instead of slidding the images. my code doenst give any errors but doesn't do anything either. Can you please help me.

this is my xml code:

<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" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="44dp"
        android:layout_marginTop="44dp"
        android:src="@drawable/ic_launcher"
        android:tag="1" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView1"
        android:layout_marginLeft="3dp"
        android:layout_toRightOf="@+id/imageView1"
        android:src="@drawable/ic_launcher" 
        android:tag="2" />

    <ImageView
        android:id="@+id/imageView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView2"
        android:layout_marginLeft="3dp"
        android:layout_toRightOf="@+id/imageView2"
        android:src="@drawable/ic_launcher"
        android:tag="3"  />

    <ImageView
        android:id="@+id/imageView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/imageView1"
        android:layout_below="@+id/imageView1"
        android:layout_marginTop="3dp"
        android:src="@drawable/ic_launcher" />

    <ImageView
        android:id="@+id/imageView5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView4"
        android:layout_alignLeft="@+id/imageView2"
        android:src="@drawable/ic_launcher" />

    <ImageView
        android:id="@+id/imageView6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView5"
        android:layout_alignLeft="@+id/imageView3"
        android:src="@drawable/ic_launcher" />

    <ImageView
        android:id="@+id/imageView7"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/imageView4"
        android:layout_below="@+id/imageView4"
        android:layout_marginTop="3dp"
        android:src="@drawable/ic_launcher" />

    <ImageView
        android:id="@+id/imageView8"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView7"
        android:layout_alignLeft="@+id/imageView5"
        android:src="@drawable/ic_launcher" />

    <ImageView
        android:id="@+id/imageView9"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView8"
        android:layout_alignRight="@+id/imageView6"
        android:src="@drawable/ic_launcher" />

</RelativeLayout>

and this is my MainActivity code:

package com.example.puzzelencauseican;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;

public class MainActivity extends Activity implements OnClickListener {

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

    ImageView image1=(ImageView) findViewById(R.id.imageView1);
    Bitmap bmp=BitmapFactory.decodeResource(getResources(), R.drawable.img1);
    int width=(int)(bmp.getWidth() /2);
    int height=(int)(bmp.getHeight() /2);
    Bitmap resizedbitmap=Bitmap.createScaledBitmap(bmp,width, height,true);
    image1.setImageBitmap(resizedbitmap);
    image1.setOnClickListener(this);

    ImageView image2=(ImageView) findViewById(R.id.imageView2);
    Bitmap bmp2=BitmapFactory.decodeResource(getResources(), R.drawable.img2);
    int width2=(int)(bmp2.getWidth() /2);
    int height2=(int)(bmp2.getHeight() /2);
    Bitmap resizedbitmap2=Bitmap.createScaledBitmap(bmp2, width2, height2,true);
    image2.setImageBitmap(resizedbitmap2);
    image2.setOnClickListener(this);

    ImageView image3=(ImageView) findViewById(R.id.imageView3);
    Bitmap bmp3=BitmapFactory.decodeResource(getResources(), R.drawable.img3);
    int width3=(int)(bmp3.getWidth() /2);
    int height3=(int)(bmp3.getHeight() /2);
    Bitmap resizedbitmap3=Bitmap.createScaledBitmap(bmp3, width3, height3,true);
    image3.setImageBitmap(resizedbitmap3);
    image3.setOnClickListener(this);

    ImageView image4=(ImageView) findViewById(R.id.imageView4);
    Bitmap bmp4=BitmapFactory.decodeResource(getResources(), R.drawable.img4);
    int width4=(int)(bmp4.getWidth() /2);
    int height4=(int)(bmp4.getHeight() /2);
    Bitmap resizedbitmap4=Bitmap.createScaledBitmap(bmp4, width4, height4,true);
    image4.setImageBitmap(resizedbitmap4);
    image4.setOnClickListener(this);

    ImageView image5=(ImageView) findViewById(R.id.imageView5);
    Bitmap bmp5=BitmapFactory.decodeResource(getResources(), R.drawable.img5);
    int width5=(int)(bmp5.getWidth() /2);
    int height5=(int)(bmp5.getHeight() /2);
    Bitmap resizedbitmap5=Bitmap.createScaledBitmap(bmp5,width5, height5,true);
    image5.setImageBitmap(resizedbitmap5);
    image5.setOnClickListener(this);

    ImageView image6=(ImageView) findViewById(R.id.imageView6);
    Bitmap bmp6=BitmapFactory.decodeResource(getResources(), R.drawable.img6);
    int width6=(int)(bmp6.getWidth() /2);
    int height6=(int)(bmp6.getHeight() /2);
    Bitmap resizedbitmap6=Bitmap.createScaledBitmap(bmp6,width6, height6,true);
    image6.setImageBitmap(resizedbitmap6);
    image6.setOnClickListener(this);

    ImageView image7=(ImageView) findViewById(R.id.imageView7);
    Bitmap bmp7=BitmapFactory.decodeResource(getResources(), R.drawable.img7);
    int width7=(int)(bmp7.getWidth() /2);
    int height7=(int)(bmp7.getHeight() /2);
    Bitmap resizedbitmap7=Bitmap.createScaledBitmap(bmp7,width7, height7,true);
    image7.setImageBitmap(resizedbitmap7);
    image7.setOnClickListener(this);

    ImageView image8=(ImageView) findViewById(R.id.imageView8);
    Bitmap bmp8=BitmapFactory.decodeResource(getResources(), R.drawable.img8);
    int width8=(int)(bmp8.getWidth() /2);
    int height8=(int)(bmp8.getHeight() /2);
    Bitmap resizedbitmap8=Bitmap.createScaledBitmap(bmp8,width8, height8,true);
    image8.setImageBitmap(resizedbitmap8);
    image8.setOnClickListener(this);

    ImageView image9=(ImageView) findViewById(R.id.imageView9);
    Bitmap bmp9=BitmapFactory.decodeResource(getResources(), R.drawable.leeg);
    int width9=(int)(bmp8.getWidth() /2);
    int height9=(int)(bmp8.getHeight() /2);
    Bitmap resizedbitmap9=Bitmap.createScaledBitmap(bmp9,width9, height9,true);
    image9.setImageBitmap(resizedbitmap9);
    image9.setOnClickListener(this);

}

private void imageView1Click() {
    ImageView image1=(ImageView) findViewById(R.id.imageView1);
    ImageView image2 = (ImageView) findViewById(R.id.imageView2);
    ImageView image4 = (ImageView) findViewById(R.id.imageView4);
    Context mContext = null;
    Drawable leeg;

    leeg = mContext.getResources().getDrawable(R.drawable.leeg);

    if( image4.getDrawable() == leeg ){
        Drawable verander1 = image1.getBackground();
        Drawable verander2 = image4.getBackground();
        image4.setBackground(verander1);
        image1.setBackground(verander2);
    }

    if (image2.getDrawable() == leeg){
        Drawable verander1 = image1.getBackground();
        Drawable verander2 = image2.getBackground();
        image2.setBackground(verander1);
        image1.setBackground(verander2);
    }
}



private void imageView8Click() {
    ImageView image5=(ImageView) findViewById(R.id.imageView5);
    ImageView image7 = (ImageView) findViewById(R.id.imageView7);
    ImageView image8=(ImageView) findViewById(R.id.imageView8);
    ImageView image9 = (ImageView) findViewById(R.id.imageView9);
    Drawable leeg;

    leeg = getResources().getDrawable(R.drawable.leeg);

    if( image5.getDrawable() == leeg ){
        Drawable verander1 = image8.getBackground();
        Drawable verander2 = image5.getBackground();
        image5.setImageDrawable(verander1);
        image8.setImageDrawable(verander2);
    }

    if( image7.getDrawable() == leeg ){
        Drawable verander1 = image8.getBackground();
        Drawable verander2 = image7.getBackground();
        image7.setImageDrawable(verander1);
        image8.setImageDrawable(verander2);
    }

    if( image9.getDrawable() == leeg ){
        Drawable verander1 = image8.getBackground();
        Drawable verander2 = image9.getBackground();
        image9.setImageDrawable(verander1);
        image8.setImageDrawable(verander2);
    }

}

public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()) {
    case R.id.imageView1:
        imageView1Click();
        break;
    case R.id.imageView8:
        imageView8Click();
        break;
    }
}

Upvotes: 1

Views: 2157

Answers (2)

Ray
Ray

Reputation: 16235

in the click methods you call imgView.getBackground and set the backgrounds as the source for other imageVIews, is that what you intended? Shouldn't you be calling getDrawable?

I would suggest you to use ViewPager to do this feature rather than using all fixed code. Also you should comment the code in the onClick.

Update: Give this layout file a try. I just wrapped yours in a HorizontalScrollView, and modified the RelativeLayout's width.

<HorizontalScrollView 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" >
<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="44dp"
        android:layout_marginTop="44dp"
        android:src="@drawable/ic_launcher"
        android:tag="1" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView1"
        android:layout_marginLeft="3dp"
        android:layout_toRightOf="@+id/imageView1"
        android:src="@drawable/ic_launcher" 
        android:tag="2" />

    <ImageView
        android:id="@+id/imageView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView2"
        android:layout_marginLeft="3dp"
        android:layout_toRightOf="@+id/imageView2"
        android:src="@drawable/ic_launcher"
        android:tag="3"  />

    <ImageView
        android:id="@+id/imageView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/imageView1"
        android:layout_below="@+id/imageView1"
        android:layout_marginTop="3dp"
        android:src="@drawable/ic_launcher" />

    <ImageView
        android:id="@+id/imageView5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView4"
        android:layout_alignLeft="@+id/imageView2"
        android:src="@drawable/ic_launcher" />

    <ImageView
        android:id="@+id/imageView6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView5"
        android:layout_alignLeft="@+id/imageView3"
        android:src="@drawable/ic_launcher" />

    <ImageView
        android:id="@+id/imageView7"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/imageView4"
        android:layout_below="@+id/imageView4"
        android:layout_marginTop="3dp"
        android:src="@drawable/ic_launcher" />

    <ImageView
        android:id="@+id/imageView8"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView7"
        android:layout_alignLeft="@+id/imageView5"
        android:src="@drawable/ic_launcher" />

    <ImageView
        android:id="@+id/imageView9"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView8"
        android:layout_alignRight="@+id/imageView6"
        android:src="@drawable/ic_launcher" />

</RelativeLayout>

</HorizontalScrollView>

Upvotes: 1

Yaroslav Mytkalyk
Yaroslav Mytkalyk

Reputation: 17105

1) Don't use findViewById often. Use it once and preserve the links. It's rather a complex for performance operation.

2) Don't load bitmap twice. You can create two times scaled bitmap by one operation using the approach below.

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);

3)

image4.getDrawable() == leeg

Will always return false here because the leeg is freshly created object

Don't compare object contents like ==. This operator is good for comparing primitive types. The == operator compares links to objects, not the contents of objects. You would only use (object1 == object2) to check if it points to the same object instance, not the object with the same data. To compare two Drawables (and Strings and etc) use equals() method from the Object class

if (image2.getDrawable().equals(leeg)) {

Upvotes: 1

Related Questions