Merge "TouchLatency: make updates time based and add fps to ball mode"

This commit is contained in:
Adrian Salido
2018-11-28 19:18:02 +00:00
committed by Gerrit Code Review
5 changed files with 76 additions and 42 deletions

View File

@@ -3,4 +3,5 @@
/.idea /.idea
.DS_Store .DS_Store
/build /build
/gen
.iml .iml

View File

@@ -1,13 +1,13 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
android { android {
compileSdkVersion 21 compileSdkVersion 28
buildToolsVersion "21.1.2" buildToolsVersion '28.0.3'
defaultConfig { defaultConfig {
applicationId "com.prefabulated.touchlatency" applicationId "com.prefabulated.touchlatency"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 21 targetSdkVersion 28
versionCode 1 versionCode 1
versionName "1.0" versionName "1.0"
} }

View File

@@ -19,11 +19,9 @@ package com.prefabulated.touchlatency;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint; import android.graphics.Paint;
import android.os.CountDownTimer; import android.graphics.Paint.Align;
import android.os.Bundle; import android.os.Bundle;
import android.text.method.Touch;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.Log; import android.util.Log;
import android.view.Menu; import android.view.Menu;
@@ -31,15 +29,17 @@ import android.view.MenuItem;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.os.Trace; import android.os.Trace;
import java.math.RoundingMode;
import java.util.ArrayList; import java.text.DecimalFormat;
import java.util.Collections;
class TouchLatencyView extends View implements View.OnTouchListener { class TouchLatencyView extends View implements View.OnTouchListener {
private static final String LOG_TAG = "TouchLatency"; private static final String LOG_TAG = "TouchLatency";
private static final int BACKGROUND_COLOR = 0xFF400080; private static final int BACKGROUND_COLOR = 0xFF400080;
private static final int INNER_RADIUS = 70; private static final int INNER_RADIUS = 70;
private static final int BALL_RADIUS = 100; private static final int BALL_DIAMETER = 200;
private static final int SEC_TO_NANOS = 1000000000;
private static final float FPS_UPDATE_THRESHOLD = 20;
private static final long BALL_VELOCITY = 420;
public TouchLatencyView(Context context, AttributeSet attrs) { public TouchLatencyView(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
@@ -58,13 +58,17 @@ class TouchLatencyView extends View implements View.OnTouchListener {
mRedPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mRedPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mRedPaint.setColor(0xFFFF0000); mRedPaint.setColor(0xFFFF0000);
mRedPaint.setStyle(Paint.Style.FILL); mRedPaint.setStyle(Paint.Style.FILL);
mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mTextPaint.setColor(0xFFFFFFFF);
mTextPaint.setTextSize(100);
mTextPaint.setTextAlign(Align.RIGHT);
mTouching = false; mTouching = false;
mBallX = 100.0f; mLastDrawNano = 0;
mBallY = 100.0f; mFps = 0;
mVelocityX = 7.0f; mLastFpsUpdate = 0;
mVelocityY = 7.0f; mFrameCount = 0;
Trace.endSection(); Trace.endSection();
} }
@@ -113,43 +117,70 @@ class TouchLatencyView extends View implements View.OnTouchListener {
} }
} }
private Paint getBallColor() {
if (mFps > 75)
return mGreenPaint;
else if (mFps > 45)
return mYellowPaint;
else
return mRedPaint;
}
private void drawBall(Canvas canvas) { private void drawBall(Canvas canvas) {
Trace.beginSection("TouchLatencyView drawBall"); Trace.beginSection("TouchLatencyView drawBall");
int width = canvas.getWidth(); int width = canvas.getWidth();
int height = canvas.getHeight(); int height = canvas.getHeight();
float fps = 0f;
// Update position long t = System.nanoTime();
mBallX += mVelocityX; long tDiff = t - mLastDrawNano;
mBallY += mVelocityY; mLastDrawNano = t;
mFrameCount++;
// Clamp and change velocity if necessary if (tDiff < SEC_TO_NANOS) {
float left = mBallX - BALL_RADIUS; fps = 1f * SEC_TO_NANOS / tDiff;
if (left < 0) {
left = 0;
mVelocityX *= -1;
} }
float top = mBallY - BALL_RADIUS; long fDiff = t - mLastFpsUpdate;
if (top < 0) { if (Math.abs(mFps - fps) > FPS_UPDATE_THRESHOLD) {
top = 0; mFps = fps;
mVelocityY *= -1; mLastFpsUpdate = t;
mFrameCount = 0;
} else if (fDiff > SEC_TO_NANOS) {
mFps = 1f * mFrameCount * SEC_TO_NANOS / fDiff;
mLastFpsUpdate = t;
mFrameCount = 0;
} }
float right = mBallX + BALL_RADIUS; final long pos = t * BALL_VELOCITY / SEC_TO_NANOS;
if (right > width) { final long xMax = width - BALL_DIAMETER;
right = width; final long yMax = height - BALL_DIAMETER;
mVelocityX *= -1; long xOffset = pos % xMax;
} long yOffset = pos % yMax;
float bottom = mBallY + BALL_RADIUS; float left, right, top, bottom;
if (bottom > height) {
bottom = height; if (((pos / xMax) & 1) == 0) {
mVelocityY *= -1; left = xMax - xOffset;
} else {
left = xOffset;
} }
right = left + BALL_DIAMETER;
if (((pos / yMax) & 1) == 0) {
top = yMax - yOffset;
} else {
top = yOffset;
}
bottom = top + BALL_DIAMETER;
// Draw the ball // Draw the ball
canvas.drawColor(BACKGROUND_COLOR); canvas.drawColor(BACKGROUND_COLOR);
canvas.drawOval(left, top, right, bottom, mYellowPaint); canvas.drawOval(left, top, right, bottom, getBallColor());
DecimalFormat df = new DecimalFormat("fps: #.##");
df.setRoundingMode(RoundingMode.HALF_UP);
canvas.drawText(df.format(mFps), width, 100, mTextPaint);
invalidate(); invalidate();
Trace.endSection(); Trace.endSection();
} }
@@ -176,15 +207,15 @@ class TouchLatencyView extends View implements View.OnTouchListener {
Trace.endSection(); Trace.endSection();
} }
private Paint mBluePaint, mGreenPaint, mYellowPaint, mRedPaint; private final Paint mBluePaint, mGreenPaint, mYellowPaint, mRedPaint, mTextPaint;
private int mMode; private int mMode;
private boolean mTouching; private boolean mTouching;
private float mTouchX, mTouchY; private float mTouchX, mTouchY;
private float mLastDrawnX, mLastDrawnY; private float mLastDrawnX, mLastDrawnY;
private float mBallX, mBallY; private long mLastDrawNano, mLastFpsUpdate, mFrameCount;
private float mVelocityX, mVelocityY; private float mFps;
} }
public class TouchLatencyActivity extends Activity { public class TouchLatencyActivity extends Activity {

View File

@@ -3,9 +3,10 @@
buildscript { buildscript {
repositories { repositories {
jcenter() jcenter()
google()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:1.1.0' classpath 'com.android.tools.build:gradle:3.2.1'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files
@@ -15,5 +16,6 @@ buildscript {
allprojects { allprojects {
repositories { repositories {
jcenter() jcenter()
google()
} }
} }

View File

@@ -1,6 +1,6 @@
#Wed Apr 10 15:27:10 PDT 2013 #Tue Nov 27 13:37:59 PST 2018
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip