Cruinh
Cruinh

Reputation: 3721

Android: swapping two overlapping views

Can anyone tell me what's wrong with this implementation? All I want to do here is have two overlapping views that swap places when you tap the screen. Unless I'm just using it wrong, View.bringToFront() does nothing?

Below is all the code in my app. Note that I added padding to the 'backView' just to make sure the two were actually overlapping. Indeed I could see both on the screen. While tapping the top view does indeed trigger the onClick method, nothing visibly changes in response to the calls to bringToFront.

public class MainActivity extends Activity implements OnClickListener {
private ImageView frontView;
private ImageView backView;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    frontView = (ImageView) findViewById(com.example.R.id.FrontView);
    backView = (ImageView) findViewById(com.example.R.id.BackView);

    frontView.setOnClickListener(this);
    backView.setOnClickListener(this);

    backView.setPadding(10,0,0,0);
}

private boolean flag;
public void onClick(View v) {
    if (!flag) {
        backView.bringToFront();
    }
    else {
        frontView.bringToFront();
    }
    flag = !flag;
}
}

and the corresponding layout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
        android:layout_height="fill_parent"
    >
<ImageView  
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:id="@+id/FrontView"
    android:src="@drawable/front"
    />
<ImageView  
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:id="@+id/BackView"
    android:src="@drawable/back"
    />
</RelativeLayout>

Maybe it's the layout I'm using? I'm not sure... I've tried FrameLayout and LinearLayout as well.

Upvotes: 2

Views: 2817

Answers (2)

Emile
Emile

Reputation: 11721

There are a couple of Components that you can use that do this for you. ViewAnimator, ViewFlipper and ViewSwitcher. You can set the animations you require etc and they hand the rest.

here's one example. http://www.androidpeople.com/android-viewflipper-example/

Given your example, do you have to call invalidate() on the parent after you've called bringToFront() ?

Upvotes: 0

MPenades
MPenades

Reputation: 11

I would try swapping content views instead of ImageViews. Put each imageView in a different layout and then it is easy:

public void onClick(View v) {
if (!flag) {
   setContentView(R.layout.main_front);
   frontView = (ImageView) findViewById(com.example.R.id.FrontView);
   frontView.setOnClickListener(this);
}
else {
   setContentView(R.layout.main_back);
   backView = (ImageView) findViewById(com.example.R.id.BackView);
   backView.setOnClickListener(this);
}
flag = !flag;

}

Upvotes: 1

Related Questions