Как использовать представление списка вместо просмотра изображений в Android 3D-переходе - PullRequest
1 голос
/ 26 февраля 2012

Я использую другой вид списка вместо вида изображения, пытаясь сделать 3d-переход, как указано в примерах приложений. Но вид списка появляется справа от экрана вместо левого, и слова инвертируются. Мой список выглядит следующим образом :

enter image description here

Мой код:

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

Мой код xml `

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

`

Как я могу получить представление списка в правильном положении?

1 Ответ

1 голос
/ 26 февраля 2012

Вы, вероятно, поворачиваете его на 180 градусов, что приводит к обратному списку

Вам нужно повернуть на 360 градусов. Хотя это приведет к большему количеству «спиннингов», вы можете подделать это следующим образом:

Поворот списка до 90 градусов. Пока список повернут на 90 градусов, мы не видим его, и вы можете заменить свой список новым. Затем в AnimationListener.onAnimationEnd() вы просто анимируете список еще раз с 270 до 360 :

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

без прослушивания его конца.

Полная анимация:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...