简体   繁体   中英

How to use list view in place of image view in android 3d transition

I am using another list view in place of the image view trying to do 3d transition as given in sample apps.But the List view comes in right of the screen in place of left and words are inverted.my list appears like this:

在此处输入图片说明

My code is:

public class EventListActivity extends ListActivity  {

private ListView lv1, lv2;
private ViewGroup mContainer;
private ArrayList<ArrayAdapter<String>> arr;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub

    super.onCreate(savedInstanceState);
    setContentView(R.layout.eventlist);
    arr = new ArrayList<ArrayAdapter<String>>();
    String[] eventlist = getResources().getStringArray(R.array.eventlist);
    String[] eventlist1 = getResources().getStringArray(R.array.techc);
    String[] eventlist2 = getResources().getStringArray(R.array.presc);
    String[] eventlist3 = getResources().getStringArray(R.array.roboc);
    String[] eventlist4 = getResources().getStringArray(R.array.managec);
    String[] eventlist5 = getResources().getStringArray(R.array.literaryc);
    String[] eventlist6 = getResources().getStringArray(R.array.creationc);
    String[] eventlist7 = getResources().getStringArray(R.array.gamingc);
    ArrayAdapter<String> a1 = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, eventlist1);
    ArrayAdapter<String> a2 = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, eventlist2);
    ArrayAdapter<String> a3 = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, eventlist3);
    ArrayAdapter<String> a4 = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, eventlist4);
    ArrayAdapter<String> a5 = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, eventlist5);
    ArrayAdapter<String> a6 = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, eventlist6);
    ArrayAdapter<String> a7 = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, eventlist7);
    arr.add(a1);
    arr.add(a3);
    arr.add(a2);

    arr.add(a4);
    arr.add(a5);
    arr.add(a6);
    arr.add(a7);
    final ArrayAdapter<String> a = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, eventlist);
    lv1 = getListView();
    lv2 = (ListView) findViewById(R.id.list2);
    mContainer = (ViewGroup) findViewById(R.id.container);
    lv1.setAdapter(a);
    lv2.setClickable(true);
    lv2.setFocusable(true);
    mContainer
            .setPersistentDrawingCache(ViewGroup.PERSISTENT_ANIMATION_CACHE);
    lv1.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub
            lv2.setAdapter(arr.get(arg2));

            applyRotation(arg2, 0, 90);

        }
    });

}

protected void applyRotation(int position, int start, int end) {
    // TODO Auto-generated method stub
    final float centerX = mContainer.getWidth() / 2.0f;
    final float centerY = mContainer.getHeight() / 2.0f;

    // Create a new 3D rotation with the supplied parameter
    // The animation listener is used to trigger the next animation
    final Rotate3dAnimation rotation = new Rotate3dAnimation(start, end,
            centerX, centerY, 310.0f, true);
    rotation.setDuration(500);
    rotation.setFillAfter(true);
    rotation.setInterpolator(new AccelerateInterpolator());
    rotation.setAnimationListener(new DisplayNextView(position));

    mContainer.startAnimation(rotation);
}

private final class DisplayNextView implements Animation.AnimationListener {
    private final int mPosition;

    private DisplayNextView(int position) {
        mPosition = position;
    }

    public void onAnimationStart(Animation animation) {
    }

    public void onAnimationEnd(Animation animation) {
        mContainer.post(new SwapViews(mPosition));
    }

    public void onAnimationRepeat(Animation animation) {
    }
}

/**
 * This class is responsible for swapping the views and start the second
 * half of the animation.
 */
private final class SwapViews implements Runnable {
    private final int mPosition;

    public SwapViews(int position) {
        mPosition = position;
    }

    public void run() {
        final float centerX = mContainer.getWidth() / 2.0f;
        final float centerY = mContainer.getHeight() / 2.0f;
        Rotate3dAnimation rotation;

        if (mPosition > -1) {
            lv1.setVisibility(View.GONE);
            lv2.setVisibility(View.VISIBLE);
            lv2.requestFocus();

            rotation = new Rotate3dAnimation(90, 180, centerX, centerY,
                    310.0f, false);
        } else {
            lv2.setVisibility(View.GONE);
            lv1.setVisibility(View.VISIBLE);
            lv1.requestFocus();

            rotation = new Rotate3dAnimation(90, 0, centerX, centerY,
                    310.0f, false);
        }

        rotation.setDuration(500);
        rotation.setFillAfter(true);
        rotation.setInterpolator(new DecelerateInterpolator());

        mContainer.startAnimation(rotation);
    }
}}

My xml code is `

<ListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layoutAnimation="@anim/layout_bottom_to_top_slide"
    android:persistentDrawingCache="animation|scrolling" />

<ListView
    android:id="@+id/list2"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:scaleType="fitCenter"
    android:visibility="gone" />

`

How can i get the list view in right position?

You are probably rotating it to 180 degrees which results in backwards list

What you need is to rotate to 360 degrees. While this will result in more "spinnings" you can fake that by following:

Rotate list to 90 degrees. While list is turned 90 degrees we can't see it and you can replace your list with new one. Then in AnimationListener.onAnimationEnd() you just animate list one more time from 270 to 360 :

Rotate3dAnimation rotation = new Rotate3dAnimation(270, 360, centerX, centerY, 60.0f, false);

without listening to its end.

Full onAnimationEnd:

public void onAnimationEnd(Animation animation) {       
    // RENDER YOUR NEW LIST HERE

    final float centerX = mContainer.getWidth() / 2.0f;
       final float centerY = mContainer.getHeight() / 2.0f;

       Rotate3dAnimation rotation = new Rotate3dAnimation(270, 360, centerX, centerY, 60.0f, false);

    rotation.setDuration(500);
    rotation.setFillAfter(true);
    rotation.setInterpolator(new AccelerateInterpolator());
    mContainer.startAnimation(rotation);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM