preliminary animation of targets
This commit is contained in:
parent
57974468df
commit
f26802be79
5 changed files with 179 additions and 4 deletions
|
@ -32,7 +32,7 @@ import java.util.List;
|
|||
*/
|
||||
public class GamingActivity extends AppCompatActivity implements Detector.ImageListener, CameraDetector.CameraEventListener, Detector.FaceListener {
|
||||
|
||||
final String LOG_TAG = "EmotionHero";
|
||||
final static String LOG_TAG = "EmotionHero";
|
||||
|
||||
final int PERMISSIONS_REQUEST_CAMERA = 1;
|
||||
|
||||
|
@ -173,8 +173,17 @@ public class GamingActivity extends AppCompatActivity implements Detector.ImageL
|
|||
cameraPreview.setLayoutParams(params);
|
||||
videoLayout.addView(cameraPreview,0);
|
||||
|
||||
|
||||
currentScenario = new ScenarioAnger();
|
||||
|
||||
ScenarioView scenarioView;
|
||||
scenarioView = new ScenarioView(this, currentScenario);
|
||||
RelativeLayout.LayoutParams scenarioViewParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
|
||||
videoLayout.addView(scenarioView, 1, scenarioViewParams);
|
||||
// new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)
|
||||
// videoLayout.addView(scenarioView, 200, 100);
|
||||
|
||||
|
||||
// startDetector();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
package com.rubenvandeven.emotionhero;
|
||||
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.util.Log;
|
||||
|
||||
import com.affectiva.android.affdex.sdk.detector.Face;
|
||||
|
@ -16,6 +20,8 @@ abstract public class Scenario {
|
|||
|
||||
float duration = 0;
|
||||
|
||||
long startTime = 0;
|
||||
|
||||
ArrayList<Target> targets = new ArrayList<>();
|
||||
|
||||
abstract void createScenario();
|
||||
|
@ -56,7 +62,7 @@ abstract public class Scenario {
|
|||
*/
|
||||
public void setTarget(Emotion emotion, float value, float timestamp)
|
||||
{
|
||||
Log.e("SET", Float.toString(timestamp) + " " + Float.toString(duration));
|
||||
// Log.e(GamingActivity.LOG_TAG, "Set target:" + Float.toString(timestamp) + " " + Float.toString(duration));
|
||||
if(timestamp > duration)
|
||||
{
|
||||
duration = timestamp;
|
||||
|
@ -117,16 +123,58 @@ abstract public class Scenario {
|
|||
*/
|
||||
public boolean isWithinTime(float timestamp)
|
||||
{
|
||||
Log.e("TEST", Float.toString(timestamp) + " " + Float.toString(duration));
|
||||
return timestamp <= duration;
|
||||
}
|
||||
|
||||
public void drawOnCanvas(Canvas canvas) {
|
||||
// canvas;
|
||||
Paint paint = new Paint();
|
||||
paint.setColor(Color.RED);
|
||||
float height = (float) canvas.getHeight();
|
||||
float pix_per_sec = height / duration;
|
||||
|
||||
float sec_height = canvas.getHeight() * (float) 0.2; // each second is 20% of canvas height
|
||||
|
||||
float diff_y;
|
||||
// if not started, don't move the labels, if started, move them by diff_y
|
||||
if(startTime == 0) {
|
||||
diff_y = 0;
|
||||
start();
|
||||
} else {
|
||||
float diff_t = ((System.currentTimeMillis() - startTime)) / (float) 1000;
|
||||
Log.d("TIME", Float.toString(diff_t));
|
||||
if(diff_t > duration) { // never larger than scenario duration
|
||||
diff_t = duration;
|
||||
}
|
||||
diff_y = sec_height * diff_t;
|
||||
}
|
||||
|
||||
// bottom at 80%;
|
||||
float bottomline_height = height * (float) 0.8;
|
||||
|
||||
canvas.drawLine(0, bottomline_height, canvas.getWidth(), bottomline_height, paint);
|
||||
canvas.drawLine(0, bottomline_height+1, canvas.getWidth(), bottomline_height+1, paint);
|
||||
|
||||
for(Target target: targets) {
|
||||
float y_pos = bottomline_height - (target.timestamp * sec_height);
|
||||
String target_text = target.emotion.toString() + " " + target.value + "%";
|
||||
canvas.drawText(target_text, canvas.getWidth()/2, y_pos + diff_y , paint);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void start()
|
||||
{
|
||||
startTime = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class ScenarioAnger extends Scenario{
|
||||
void createScenario()
|
||||
{
|
||||
Log.e("TESTING", "CREATE SCENARIO!!!!");
|
||||
Log.d(GamingActivity.LOG_TAG, "CREATE SCENARIO: anger");
|
||||
setTarget(Emotion.ANGER, 10, 1);
|
||||
setTarget(Emotion.ANGER, 20, 2);
|
||||
setTarget(Emotion.ANGER, 40, 3);
|
||||
|
|
|
@ -0,0 +1,110 @@
|
|||
package com.rubenvandeven.emotionhero;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.PixelFormat;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.SurfaceHolder;
|
||||
import android.view.SurfaceView;
|
||||
|
||||
/**
|
||||
* Created by ruben on 16/08/16.
|
||||
*/
|
||||
|
||||
public class ScenarioView extends SurfaceView implements SurfaceHolder.Callback {
|
||||
|
||||
private PanelThread _thread;
|
||||
|
||||
private Scenario _scenario;
|
||||
|
||||
|
||||
// see: http://blog.danielnadeau.io/2012/01/android-canvas-beginners-tutorial.html
|
||||
class PanelThread extends Thread {
|
||||
private SurfaceHolder _surfaceHolder;
|
||||
private ScenarioView _panel;
|
||||
private boolean _run = false;
|
||||
|
||||
|
||||
public PanelThread(SurfaceHolder surfaceHolder, ScenarioView panel) {
|
||||
_surfaceHolder = surfaceHolder;
|
||||
_panel = panel;
|
||||
}
|
||||
|
||||
|
||||
public void setRunning(boolean run) { //Allow us to stop the thread
|
||||
_run = run;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
Canvas c;
|
||||
while (_run) { //When setRunning(false) occurs, _run is
|
||||
c = null; //set to false and loop ends, stopping thread
|
||||
|
||||
try {
|
||||
c = _surfaceHolder.lockCanvas(null);
|
||||
synchronized (_surfaceHolder) {
|
||||
//Insert methods to modify positions of items in onDraw()
|
||||
postInvalidate();
|
||||
}
|
||||
} finally {
|
||||
if (c != null) {
|
||||
_surfaceHolder.unlockCanvasAndPost(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public ScenarioView(Context context, Scenario s) {
|
||||
super(context);
|
||||
getHolder().addCallback(this);
|
||||
_scenario = s;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onDraw(Canvas canvas) {
|
||||
//do drawing stuff here.
|
||||
// Log.e("TEST2", "Jaa!");
|
||||
_scenario.drawOnCanvas(canvas);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void surfaceCreated(SurfaceHolder holder) {
|
||||
setWillNotDraw(false); //Allows us to use invalidate() to call onDraw()
|
||||
|
||||
this.setZOrderOnTop(true);
|
||||
holder.setFormat(PixelFormat.TRANSPARENT);
|
||||
|
||||
// Log.e("TEST2", "Jaa2!");
|
||||
_thread = new PanelThread(getHolder(), this); //Start the thread that
|
||||
_thread.setRunning(true); //will make calls to
|
||||
_thread.start(); //onDraw()
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void surfaceDestroyed(SurfaceHolder holder) {
|
||||
try {
|
||||
if(_thread != null) {
|
||||
_thread.setRunning(false); //Tells thread to stop
|
||||
_thread.join(); //Removes thread from mem.
|
||||
}
|
||||
} catch (InterruptedException e) {}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -30,6 +30,12 @@
|
|||
<!-- This FrameLayout insets its children based on system windows using
|
||||
android:fitsSystemWindows. -->
|
||||
|
||||
<!--<view-->
|
||||
<!--class="com.rubenvandeven.emotionhero.ScenarioView"-->
|
||||
<!--android:layout_width="match_parent"-->
|
||||
<!--android:id="@+id/scenarioView"-->
|
||||
<!--android:layout_height="match_parent" />-->
|
||||
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
|
@ -60,6 +66,7 @@
|
|||
android:layout_width="1dp"
|
||||
android:layout_height="1dp"
|
||||
android:id="@+id/surfaceView" />
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
</FrameLayout>
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
<color name="colorPrimary">#0000ff</color>
|
||||
<color name="colorPrimaryDark">#303F9F</color>
|
||||
<color name="colorAccent">#FF4081</color>
|
||||
<color name="colorScenarioLine">#FF0000</color>
|
||||
|
||||
<color name="black_overlay">#66000000</color>
|
||||
</resources>
|
||||
|
|
Loading…
Reference in a new issue