package com.example.renderthread; import android.animation.TimeInterpolator; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.SystemClock; import android.view.DisplayList; import android.view.HardwareRenderer; import android.view.ThreadedRenderer; import android.view.View; import android.view.animation.AccelerateDecelerateInterpolator; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.SimpleAdapter; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class MainActivity extends Activity implements OnItemClickListener { static final int DURATION = 400; static final String KEY_NAME = "name"; static final String KEY_CLASS = "clazz"; static Map make(String name) { Map ret = new HashMap(); ret.put(KEY_NAME, name); return ret; } @SuppressWarnings("serial") static final ArrayList> SAMPLES = new ArrayList>() {{ for (int i = 1; i < 25; i++) { add(make("List Item: " + i)); } }}; Handler mHandler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); HardwareRenderer.sUseRenderThread = true; setContentView(R.layout.activity_main); ListView lv = (ListView) findViewById(android.R.id.list); lv.setDrawSelectorOnTop(true); lv.setAdapter(new SimpleAdapter(this, SAMPLES, R.layout.item_layout, new String[] { KEY_NAME }, new int[] { android.R.id.text1 })); lv.setOnItemClickListener(this); getActionBar().setTitle("MainActivity"); } @Override protected void onResume() { super.onResume(); ListView lv = (ListView) findViewById(android.R.id.list); for (int i = 0; i < lv.getChildCount(); i++) { lv.getChildAt(i).animate().translationY(0).setDuration(DURATION); } } private static class DisplayListAnimator { private static final TimeInterpolator sDefaultInterpolator = new AccelerateDecelerateInterpolator(); DisplayList mDisplayList; float mFromValue; float mDelta; long mDuration = DURATION * 2; long mStartTime; DisplayListAnimator(View view, float translateXBy) { mDelta = translateXBy; mFromValue = view.getTranslationY(); mDisplayList = view.getDisplayList(); } boolean animate(long currentTime) { if (mStartTime == 0) mStartTime = currentTime; float fraction = (float)(currentTime - mStartTime) / mDuration; if (fraction > 1) { return false; } fraction = sDefaultInterpolator.getInterpolation(fraction); float translation = mFromValue + (mDelta * fraction); mDisplayList.setTranslationY(translation); return fraction < 1f; } } private static class AnimationExecutor implements Runnable { DisplayListAnimator[] mAnimations; ThreadedRenderer mRenderer; AnimationExecutor(ThreadedRenderer renderer, DisplayListAnimator[] animations) { mRenderer = renderer; mAnimations = animations; ThreadedRenderer.postToRenderThread(this); } @Override public void run() { boolean hasMore = false; long now = SystemClock.uptimeMillis(); for (DisplayListAnimator animator : mAnimations) { hasMore |= animator.animate(now); } mRenderer.repeatLastDraw(); if (hasMore) { ThreadedRenderer.postToRenderThread(this); } } } @Override public void onItemClick(final AdapterView adapterView, View clickedView, int clickedPosition, long clickedId) { int topPosition = adapterView.getFirstVisiblePosition(); int dy = adapterView.getHeight(); final DisplayListAnimator[] animators = new DisplayListAnimator[adapterView.getChildCount()]; for (int i = 0; i < adapterView.getChildCount(); i++) { int pos = topPosition + i; View child = adapterView.getChildAt(i); float delta = (pos - clickedPosition) * 1.1f; if (delta == 0) delta = -1; animators[i] = new DisplayListAnimator(child, dy * delta); } adapterView.invalidate(); adapterView.post(new Runnable() { @Override public void run() { new AnimationExecutor((ThreadedRenderer) adapterView.getHardwareRenderer(), animators); } }); //mHandler.postDelayed(mLaunchActivity, (long) (DURATION * .4)); mLaunchActivity.run(); } private Runnable mLaunchActivity = new Runnable() { @Override public void run() { startActivity(new Intent(MainActivity.this, SubActivity.class)); overridePendingTransition(0, 0); } }; }