weknowhowyoufeel/app/src/main/java/com/affectiva/affdexme/MetricDisplay.java

162 lines
5.4 KiB
Java

package com.affectiva.affdexme;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.View;
import java.lang.reflect.Method;
/**
* The MetricView class is used to display metric scores on top of colored bars whose color depend on the score.
*/
public class MetricDisplay extends View {
MetricsManager.Metrics metricToDisplay; //indicates which of the 24 Affectiva Emotions and Expressions this view is displaying
Method faceScoreMethod;
float midX = 0; //coordinates of the center of the view
float midY = 0;
float halfWidth = 50;//default width and height of view
float height = 10;
String text = ""; //score in text format
Paint textPaint;
Paint boxPaint;
float left = 0; //colored bar is drawn using left,right,top, and height variables
float right = 0;
float top = 0;
float textBottom = 0; //tells our view where to draw the baseline of the font
boolean isShadedMetricView = false;
public MetricDisplay(Context context) {
super(context);
initResources(context,null);
}
public MetricDisplay(Context context, AttributeSet attrs) {
super(context,attrs);
initResources(context,attrs);
}
public MetricDisplay(Context context, AttributeSet attrs, int styleID){
super(context, attrs, styleID);
initResources(context,attrs);
}
void setIsShadedMetricView(boolean b) {
this.isShadedMetricView = b;
if (!b) {
boxPaint.setColor(Color.GREEN);
}
}
void initResources(Context context, AttributeSet attrs) {
boxPaint = new Paint();
boxPaint.setColor(Color.GREEN);
textPaint = new Paint();
textPaint.setStyle(Paint.Style.FILL);
textPaint.setTextAlign(Paint.Align.CENTER);
int textSize = 15; //default text size value
//load and parse XML attributes
if (attrs != null) {
TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.custom_attributes,0,0);
textPaint.setColor(a.getColor(R.styleable.custom_attributes_textColor, Color.BLACK));
textSize = a.getDimensionPixelSize(R.styleable.custom_attributes_textSize, textSize);
textPaint.setTextSize(textSize);
halfWidth = a.getDimensionPixelSize(R.styleable.custom_attributes_barLength,100)/2;
a.recycle();
} else {
textPaint.setColor(Color.BLACK);
textPaint.setTextSize(textSize);
}
/**
* We set the desired height of the view to be as large as our text.
* We also offset the bottom line at which our text is drawn, to give the appearance
* that the text is centered vertically.
*/
height = textSize;
textBottom = height - 5;
}
public void setMetricToDisplay(MetricsManager.Metrics metricToDisplay, Method faceScoreMethod) {
this.metricToDisplay = metricToDisplay;
this.faceScoreMethod = faceScoreMethod;
}
public MetricsManager.Metrics getMetricToDisplay() {
return this.metricToDisplay;
}
public Method getFaceScoreMethod() {
return this.faceScoreMethod;
}
public void setTypeface(Typeface face) {
textPaint.setTypeface(face);
}
public void setScore(float s){
text = String.format("%.0f%%", s); //change the text of the view
//shading mode is turned on for Valence, which causes this view to shade its color according
//to the value of 's'
if (isShadedMetricView) {
if (s > 0) {
left = midX - (halfWidth * (s / 100));
right = midX + (halfWidth * (s / 100));
} else {
left = midX - (halfWidth * (-s / 100));
right = midX + (halfWidth * (-s / 100));
}
if (s > 0) {
float colorScore = ((100f-s)/100f)*255;
boxPaint.setColor(Color.rgb((int)colorScore,255,(int)colorScore));
} else {
float colorScore = ((100f+s)/100f)*255;
boxPaint.setColor(Color.rgb(255,(int)colorScore,(int)colorScore));
}
} else {
left = midX - (halfWidth * (s / 100)); //change the coordinates at which the colored bar will be drawn
right = midX + (halfWidth * (s / 100));
}
invalidate(); //instruct Android to re-draw our view, now that the text has changed
}
/**
* set our view to be the minimum of the sizes that Android will allow and our desired sizes
* **/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension((int)Math.min(MeasureSpec.getSize(widthMeasureSpec), halfWidth *2), (int)Math.min(MeasureSpec.getSize(heightMeasureSpec),height));
}
@Override
protected void onSizeChanged(int w, int h, int oldW, int oldH) {
super.onSizeChanged(w,h,oldW,oldH);
midX = w/2;
midY = h/2;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//draws the colored bar that appears behind our score
canvas.drawRect(left,top,right,height, boxPaint);
//draws the score
canvas.drawText(text,midX , textBottom, textPaint);
}
}