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