blob: 3a8984047ae0ecf38506431f964034075e183d02 [file] [log] [blame]
/*
* Copyright 2021 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
package org.skia.androidkitdemo1;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import org.skia.androidkit.*;
class RenderThread extends Thread {
private android.view.Surface mAndroidSurface;
private Surface mSurface;
private boolean mRunning;
private static final String TAG = "*** AK RenderThread";
public RenderThread(android.view.Surface surface) {
mAndroidSurface = surface;
}
public void finish() {
mRunning = false;
}
@Override
public void run() {
mRunning = true;
Log.d(TAG, "start");
long time_base = java.lang.System.currentTimeMillis();
// TODO: convert to native AK surface.
while (mRunning) {
android.graphics.Canvas android_canvas = mAndroidSurface.lockHardwareCanvas();
int w = android_canvas.getWidth(),
h = android_canvas.getHeight();
android.graphics.Bitmap bm =
android.graphics.Bitmap.createBitmap(w, h,
android.graphics.Bitmap.Config.ARGB_8888,
true);
Surface surface = new Surface(bm);
renderFrame(surface.getCanvas(),
(double)(java.lang.System.currentTimeMillis() - time_base) / 1000,
w, h);
surface.flushAndSubmit();
surface.release();
android_canvas.drawBitmap(bm, 0, 0, new android.graphics.Paint());
mAndroidSurface.unlockCanvasAndPost(android_canvas);
}
Log.d(TAG, "finish");
}
private void renderFrame(Canvas canvas, double t, int canvas_width, int canvas_height) {
final float kWidth = 400,
kHeight = 200,
kSpeed = 4;
canvas.drawColor(0xffffffe0);
Paint p = new Paint();
p.setColor(new Color(0, 1, 0, 1));
float x = (float)(java.lang.Math.cos(t * kSpeed) + 1) * canvas_width/2;
canvas.drawRect(x - kWidth/2, (canvas_height - kHeight)/2,
x + kWidth/2, (canvas_height + kHeight)/2, p);
}
}
public class AnimationActivity extends Activity implements SurfaceHolder.Callback {
static {
System.loadLibrary("androidkit");
}
private RenderThread mRenderThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animation);
SurfaceView sv = findViewById(R.id.surfaceView);
sv.getHolder().addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if (mRenderThread != null) {
mRenderThread.finish();
try {
mRenderThread.join();
} catch (InterruptedException e) {}
}
mRenderThread = new RenderThread(holder.getSurface());;
mRenderThread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mRenderThread != null) {
mRenderThread.finish();
try {
mRenderThread.join();
} catch (InterruptedException e) {}
}
}
}