MainActivity.java revision cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fc
1
2package com.example.renderthread;
3
4import android.animation.TimeInterpolator;
5import android.app.Activity;
6import android.content.Intent;
7import android.os.Bundle;
8import android.os.Handler;
9import android.os.SystemClock;
10import android.view.DisplayList;
11import android.view.HardwareRenderer;
12import android.view.ThreadedRenderer;
13import android.view.View;
14import android.view.animation.AccelerateDecelerateInterpolator;
15import android.widget.AdapterView;
16import android.widget.AdapterView.OnItemClickListener;
17import android.widget.ListView;
18import android.widget.SimpleAdapter;
19
20import java.util.ArrayList;
21import java.util.HashMap;
22import java.util.Map;
23
24public class MainActivity extends Activity implements OnItemClickListener {
25
26    static final int DURATION = 400;
27
28    static final String KEY_NAME = "name";
29    static final String KEY_CLASS = "clazz";
30
31    static Map<String,?> make(String name) {
32        Map<String,Object> ret = new HashMap<String,Object>();
33        ret.put(KEY_NAME, name);
34        return ret;
35    }
36
37    @SuppressWarnings("serial")
38    static final ArrayList<Map<String,?>> SAMPLES = new ArrayList<Map<String,?>>() {{
39        for (int i = 1; i < 25; i++) {
40            add(make("List Item: " + i));
41        }
42    }};
43
44    Handler mHandler = new Handler();
45
46    @Override
47    protected void onCreate(Bundle savedInstanceState) {
48        super.onCreate(savedInstanceState);
49        HardwareRenderer.sUseRenderThread = true;
50        setContentView(R.layout.activity_main);
51        ListView lv = (ListView) findViewById(android.R.id.list);
52        lv.setDrawSelectorOnTop(true);
53        lv.setAdapter(new SimpleAdapter(this, SAMPLES,
54                R.layout.item_layout, new String[] { KEY_NAME },
55                new int[] { android.R.id.text1 }));
56        lv.setOnItemClickListener(this);
57        getActionBar().setTitle("MainActivity");
58    }
59
60    @Override
61    protected void onResume() {
62        super.onResume();
63        ListView lv = (ListView) findViewById(android.R.id.list);
64        for (int i = 0; i < lv.getChildCount(); i++) {
65            lv.getChildAt(i).animate().translationY(0).setDuration(DURATION);
66        }
67    }
68
69    private static class DisplayListAnimator {
70        private static final TimeInterpolator sDefaultInterpolator =
71                new AccelerateDecelerateInterpolator();
72
73        DisplayList mDisplayList;
74        float mFromValue;
75        float mDelta;
76        long mDuration = DURATION * 2;
77        long mStartTime;
78
79        DisplayListAnimator(View view, float translateXBy) {
80            mDelta = translateXBy;
81            mFromValue = view.getTranslationY();
82            mDisplayList = view.getDisplayList();
83        }
84
85        boolean animate(long currentTime) {
86            if (mStartTime == 0) mStartTime = currentTime;
87
88            float fraction = (float)(currentTime - mStartTime) / mDuration;
89            if (fraction > 1) {
90                return false;
91            }
92            fraction = sDefaultInterpolator.getInterpolation(fraction);
93            float translation = mFromValue + (mDelta * fraction);
94            mDisplayList.setTranslationY(translation);
95            return fraction < 1f;
96        }
97    }
98
99    private static class AnimationExecutor implements Runnable {
100        DisplayListAnimator[] mAnimations;
101        ThreadedRenderer mRenderer;
102
103        AnimationExecutor(ThreadedRenderer renderer, DisplayListAnimator[] animations) {
104            mRenderer = renderer;
105            mAnimations = animations;
106            ThreadedRenderer.postToRenderThread(this);
107        }
108
109        @Override
110        public void run() {
111            boolean hasMore = false;
112            long now = SystemClock.uptimeMillis();
113            for (DisplayListAnimator animator : mAnimations) {
114                hasMore |= animator.animate(now);
115            }
116            mRenderer.repeatLastDraw();
117            if (hasMore) {
118                ThreadedRenderer.postToRenderThread(this);
119            }
120        }
121
122    }
123
124    @Override
125    public void onItemClick(final AdapterView<?> adapterView, View clickedView,
126            int clickedPosition, long clickedId) {
127        int topPosition = adapterView.getFirstVisiblePosition();
128        int dy = adapterView.getHeight();
129        final DisplayListAnimator[] animators = new DisplayListAnimator[adapterView.getChildCount()];
130        for (int i = 0; i < adapterView.getChildCount(); i++) {
131            int pos = topPosition + i;
132            View child = adapterView.getChildAt(i);
133            float delta = (pos - clickedPosition) * 1.1f;
134            if (delta == 0) delta = -1;
135            animators[i] = new DisplayListAnimator(child, dy * delta);
136        }
137        adapterView.invalidate();
138        adapterView.post(new Runnable() {
139
140            @Override
141            public void run() {
142                new AnimationExecutor((ThreadedRenderer) adapterView.getHardwareRenderer(), animators);
143            }
144        });
145        //mHandler.postDelayed(mLaunchActivity, (long) (DURATION * .4));
146        mLaunchActivity.run();
147    }
148
149    private Runnable mLaunchActivity = new Runnable() {
150
151        @Override
152        public void run() {
153            startActivity(new Intent(MainActivity.this, SubActivity.class));
154            overridePendingTransition(0, 0);
155        }
156    };
157
158}
159