am 9e49b5d6: Merge "Move PIN/Pattern appear animation to RenderThread (1/2)" into mnc-dev

* commit '9e49b5d679672ea4a64382f9a36663c73603961b':
  Move PIN/Pattern appear animation to RenderThread (1/2)
This commit is contained in:
Jorim Jaggi
2015-07-27 19:22:02 +00:00
committed by Android Git Automerger
5 changed files with 242 additions and 82 deletions

View File

@@ -23,10 +23,10 @@ import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.CanvasProperty;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import android.media.AudioManager;
import android.os.Bundle;
import android.os.Debug;
@@ -38,8 +38,10 @@ import android.provider.Settings;
import android.util.AttributeSet;
import android.util.IntArray;
import android.util.Log;
import android.view.DisplayListCanvas;
import android.view.HapticFeedbackConstants;
import android.view.MotionEvent;
import android.view.RenderNodeAnimator;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
@@ -200,10 +202,16 @@ public class LockPatternView extends View {
}
public static class CellState {
public float scale = 1.0f;
public float translateY = 0.0f;
public float alpha = 1.0f;
public float size;
int row;
int col;
boolean hwAnimating;
CanvasProperty<Float> hwRadius;
CanvasProperty<Float> hwCenterX;
CanvasProperty<Float> hwCenterY;
CanvasProperty<Paint> hwPaint;
float radius;
float translationY;
float alpha = 1f;
public float lineEndX = Float.MIN_VALUE;
public float lineEndY = Float.MIN_VALUE;
public ValueAnimator lineAnimator;
@@ -313,7 +321,9 @@ public class LockPatternView extends View {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
mCellStates[i][j] = new CellState();
mCellStates[i][j].size = mDotSize;
mCellStates[i][j].radius = mDotSize/2;
mCellStates[i][j].row = i;
mCellStates[i][j].col = j;
}
}
@@ -412,6 +422,112 @@ public class LockPatternView extends View {
invalidate();
}
public void startCellStateAnimation(CellState cellState, float startAlpha, float endAlpha,
float startTranslationY, float endTranslationY, float startScale, float endScale,
long delay, long duration,
Interpolator interpolator, Runnable finishRunnable) {
if (isHardwareAccelerated()) {
startCellStateAnimationHw(cellState, startAlpha, endAlpha, startTranslationY,
endTranslationY, startScale, endScale, delay, duration, interpolator,
finishRunnable);
} else {
startCellStateAnimationSw(cellState, startAlpha, endAlpha, startTranslationY,
endTranslationY, startScale, endScale, delay, duration, interpolator,
finishRunnable);
}
}
private void startCellStateAnimationSw(final CellState cellState,
final float startAlpha, final float endAlpha,
final float startTranslationY, final float endTranslationY,
final float startScale, final float endScale,
long delay, long duration, Interpolator interpolator, final Runnable finishRunnable) {
cellState.alpha = startAlpha;
cellState.translationY = startTranslationY;
cellState.radius = mDotSize/2 * startScale;
ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f);
animator.setDuration(duration);
animator.setStartDelay(delay);
animator.setInterpolator(interpolator);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float t = (float) animation.getAnimatedValue();
cellState.alpha = (1 - t) * startAlpha + t * endAlpha;
cellState.translationY = (1 - t) * startTranslationY + t * endTranslationY;
cellState.radius = mDotSize/2 * ((1 - t) * startScale + t * endScale);
invalidate();
}
});
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
if (finishRunnable != null) {
finishRunnable.run();
}
}
});
animator.start();
}
private void startCellStateAnimationHw(final CellState cellState,
float startAlpha, float endAlpha,
float startTranslationY, float endTranslationY,
float startScale, float endScale,
long delay, long duration, Interpolator interpolator, final Runnable finishRunnable) {
cellState.alpha = endAlpha;
cellState.translationY = endTranslationY;
cellState.radius = mDotSize/2 * endScale;
cellState.hwAnimating = true;
cellState.hwCenterY = CanvasProperty.createFloat(
getCenterYForRow(cellState.row) + startTranslationY);
cellState.hwCenterX = CanvasProperty.createFloat(getCenterXForColumn(cellState.col));
cellState.hwRadius = CanvasProperty.createFloat(mDotSize/2 * startScale);
mPaint.setColor(getCurrentColor(false));
mPaint.setAlpha((int) (startAlpha * 255));
cellState.hwPaint = CanvasProperty.createPaint(new Paint(mPaint));
startRtFloatAnimation(cellState.hwCenterY,
getCenterYForRow(cellState.row) + endTranslationY, delay, duration, interpolator);
startRtFloatAnimation(cellState.hwRadius, mDotSize/2 * endScale, delay, duration,
interpolator);
startRtAlphaAnimation(cellState, endAlpha, delay, duration, interpolator,
new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
cellState.hwAnimating = false;
if (finishRunnable != null) {
finishRunnable.run();
}
}
});
invalidate();
}
private void startRtAlphaAnimation(CellState cellState, float endAlpha,
long delay, long duration, Interpolator interpolator,
Animator.AnimatorListener listener) {
RenderNodeAnimator animator = new RenderNodeAnimator(cellState.hwPaint,
RenderNodeAnimator.PAINT_ALPHA, (int) (endAlpha * 255));
animator.setDuration(duration);
animator.setStartDelay(delay);
animator.setInterpolator(interpolator);
animator.setTarget(this);
animator.addListener(listener);
animator.start();
}
private void startRtFloatAnimation(CanvasProperty<Float> property, float endValue,
long delay, long duration, Interpolator interpolator) {
RenderNodeAnimator animator = new RenderNodeAnimator(property, endValue);
animator.setDuration(duration);
animator.setStartDelay(delay);
animator.setInterpolator(interpolator);
animator.setTarget(this);
animator.start();
}
private void notifyCellAdded() {
// sendAccessEvent(R.string.lockscreen_access_pattern_cell_added);
if (mOnPatternListener != null) {
@@ -603,14 +719,15 @@ public class LockPatternView extends View {
private void startCellActivatedAnimation(Cell cell) {
final CellState cellState = mCellStates[cell.row][cell.column];
startSizeAnimation(mDotSize, mDotSizeActivated, 96, mLinearOutSlowInInterpolator,
startRadiusAnimation(mDotSize/2, mDotSizeActivated/2, 96, mLinearOutSlowInInterpolator,
cellState, new Runnable() {
@Override
public void run() {
startSizeAnimation(mDotSizeActivated, mDotSize, 192, mFastOutSlowInInterpolator,
cellState, null);
}
});
@Override
public void run() {
startRadiusAnimation(mDotSizeActivated/2, mDotSize/2, 192,
mFastOutSlowInInterpolator,
cellState, null);
}
});
startLineEndAnimation(cellState, mInProgressX, mInProgressY,
getCenterXForColumn(cell.column), getCenterYForRow(cell.row));
}
@@ -639,13 +756,13 @@ public class LockPatternView extends View {
state.lineAnimator = valueAnimator;
}
private void startSizeAnimation(float start, float end, long duration, Interpolator interpolator,
final CellState state, final Runnable endRunnable) {
private void startRadiusAnimation(float start, float end, long duration,
Interpolator interpolator, final CellState state, final Runnable endRunnable) {
ValueAnimator valueAnimator = ValueAnimator.ofFloat(start, end);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
state.size = (float) animation.getAnimatedValue();
state.radius = (float) animation.getAnimatedValue();
invalidate();
}
});
@@ -969,10 +1086,16 @@ public class LockPatternView extends View {
for (int j = 0; j < 3; j++) {
CellState cellState = mCellStates[i][j];
float centerX = getCenterXForColumn(j);
float size = cellState.size * cellState.scale;
float translationY = cellState.translateY;
drawCircle(canvas, (int) centerX, (int) centerY + translationY,
size, drawLookup[i][j], cellState.alpha);
float translationY = cellState.translationY;
if (isHardwareAccelerated() && cellState.hwAnimating) {
DisplayListCanvas displayListCanvas = (DisplayListCanvas) canvas;
displayListCanvas.drawCircle(cellState.hwCenterX, cellState.hwCenterY,
cellState.hwRadius, cellState.hwPaint);
} else {
drawCircle(canvas, (int) centerX, (int) centerY + translationY,
cellState.radius, drawLookup[i][j], cellState.alpha);
}
}
}
@@ -1055,11 +1178,11 @@ public class LockPatternView extends View {
/**
* @param partOfPattern Whether this circle is part of the pattern.
*/
private void drawCircle(Canvas canvas, float centerX, float centerY, float size,
private void drawCircle(Canvas canvas, float centerX, float centerY, float radius,
boolean partOfPattern, float alpha) {
mPaint.setColor(getCurrentColor(partOfPattern));
mPaint.setAlpha((int) (alpha * 255));
canvas.drawCircle(centerX, centerY, size/2, mPaint);
canvas.drawCircle(centerX, centerY, radius, mPaint);
}
@Override
@@ -1290,7 +1413,6 @@ public class LockPatternView extends View {
float centerY = getCenterYForRow(row);
float cellheight = mSquareHeight * mHitFactor * 0.5f;
float cellwidth = mSquareWidth * mHitFactor * 0.5f;
float translationY = cell.translateY;
bounds.left = (int) (centerX - cellwidth);
bounds.right = (int) (centerX + cellwidth);
bounds.top = (int) (centerY - cellheight);