Merge "TouchLatency: make updates time based and add fps to ball mode"
This commit is contained in:
1
tests/TouchLatency/.gitignore
vendored
1
tests/TouchLatency/.gitignore
vendored
@@ -3,4 +3,5 @@
|
|||||||
/.idea
|
/.idea
|
||||||
.DS_Store
|
.DS_Store
|
||||||
/build
|
/build
|
||||||
|
/gen
|
||||||
.iml
|
.iml
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user