moved drawing code into a seperate class

This commit is contained in:
danijoo
2015-12-03 14:58:02 +01:00
parent e8c999a36b
commit 9f1bb7c4d2
2 changed files with 126 additions and 92 deletions

View File

@@ -21,13 +21,8 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.Typeface;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
@@ -46,8 +41,6 @@ import java.util.concurrent.TimeUnit;
* low-bit ambient mode, the text is drawn without anti-aliasing in ambient mode. * low-bit ambient mode, the text is drawn without anti-aliasing in ambient mode.
*/ */
public class SunshineWatchFaceService extends CanvasWatchFaceService { public class SunshineWatchFaceService extends CanvasWatchFaceService {
private static final Typeface NORMAL_TYPEFACE =
Typeface.create(Typeface.SANS_SERIF, Typeface.NORMAL);
/** /**
* Update rate in milliseconds for interactive mode. We update once a second since seconds are * Update rate in milliseconds for interactive mode. We update once a second since seconds are
@@ -87,12 +80,9 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
private class SunshineWatchFaceEngine extends CanvasWatchFaceService.Engine { private class SunshineWatchFaceEngine extends CanvasWatchFaceService.Engine {
final Handler mUpdateTimeHandler = new EngineHandler(this); final Handler mUpdateTimeHandler = new EngineHandler(this);
WatchFaceDrawHelper mDrawerHelper;
boolean mRegisteredTimeZoneReceiver = false; boolean mRegisteredTimeZoneReceiver = false;
Paint mBackgroundPaint;
Paint mTimeTextPaint;
Paint mDateTextPaint;
Paint mHighestTempPaint;
Paint mLowestTempPaint;
boolean mAmbient; boolean mAmbient;
Time mTime; Time mTime;
final BroadcastReceiver mTimeZoneReceiver = new BroadcastReceiver() { final BroadcastReceiver mTimeZoneReceiver = new BroadcastReceiver() {
@@ -102,13 +92,6 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
mTime.setToNow(); mTime.setToNow();
} }
}; };
float mTimeXOffset;
float mTimeYOffset;
float mDateXOffset;
float mDateYOffset;
float mWeatherYOffset;
float mWeatherXOffset;
float mWeatherXOffset2;
/** /**
* Whether the display supports fewer bits for each color in ambient mode. When true, we * Whether the display supports fewer bits for each color in ambient mode. When true, we
@@ -126,20 +109,6 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
.setShowSystemUiTime(false) .setShowSystemUiTime(false)
.setAcceptsTapEvents(true) .setAcceptsTapEvents(true)
.build()); .build());
Resources resources = SunshineWatchFaceService.this.getResources();
mTimeYOffset = resources.getDimension(R.dimen.time_y_offset);
mDateYOffset = resources.getDimension(R.dimen.date_y_offset);
mWeatherYOffset = resources.getDimension(R.dimen.weather_y_offset);
mBackgroundPaint = new Paint();
mBackgroundPaint.setColor(resources.getColor(R.color.background));
mTimeTextPaint = createTextPaint(resources.getColor(R.color.textcolor_primary));
mDateTextPaint = createTextPaint(resources.getColor(R.color.textcolor_secondary));
mHighestTempPaint = createTextPaint(resources.getColor(R.color.textcolor_primary));
mHighestTempPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD));
mLowestTempPaint = createTextPaint(resources.getColor(R.color.textcolor_primary));
mTime = new Time(); mTime = new Time();
} }
@@ -150,14 +119,6 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
super.onDestroy(); super.onDestroy();
} }
private Paint createTextPaint(int textColor) {
Paint paint = new Paint();
paint.setColor(textColor);
paint.setTypeface(NORMAL_TYPEFACE);
paint.setAntiAlias(true);
return paint;
}
@Override @Override
public void onVisibilityChanged(boolean visible) { public void onVisibilityChanged(boolean visible) {
super.onVisibilityChanged(visible); super.onVisibilityChanged(visible);
@@ -198,39 +159,16 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
public void onApplyWindowInsets(WindowInsets insets) { public void onApplyWindowInsets(WindowInsets insets) {
super.onApplyWindowInsets(insets); super.onApplyWindowInsets(insets);
// Load resources that have alternate values for round watches.
Resources resources = SunshineWatchFaceService.this.getResources(); Resources resources = SunshineWatchFaceService.this.getResources();
boolean isRound = insets.isRound(); boolean isRound = insets.isRound();
mTimeXOffset = resources.getDimension(isRound mDrawerHelper = new WatchFaceDrawHelper(resources, isRound);
? R.dimen.time_x_offset_round : R.dimen.time_x_offset);
mDateXOffset = resources.getDimension(isRound
? R.dimen.date_x_offset_round : R.dimen.date_x_offset);
mWeatherXOffset = resources.getDimension(isRound
? R.dimen.weather_x_offset_round : R.dimen.weather_x_offset);
mWeatherXOffset2 = resources.getDimension(isRound
? R.dimen.weather_x_offset_round_2 : R.dimen.weather_x_offset_2);
float timeTextSize = resources.getDimension(isRound
? R.dimen.time_text_size_round : R.dimen.time_text_size);
mTimeTextPaint.setTextSize(timeTextSize);
float dateTextSize = resources.getDimension(isRound
? R.dimen.date_text_size_round : R.dimen.date_text_size);
mDateTextPaint.setTextSize(dateTextSize);
float weatherTextSize = resources.getDimension(isRound
? R.dimen.weather_text_size_round : R.dimen.weather_text_size);
mHighestTempPaint.setTextSize(weatherTextSize);
float weatherTextSize2 = resources.getDimension(isRound
? R.dimen.weather_text_size_round_2 : R.dimen.weather_text_size_2);
mLowestTempPaint.setTextSize(weatherTextSize2);
} }
@Override @Override
public void onPropertiesChanged(Bundle properties) { public void onPropertiesChanged(Bundle properties) {
super.onPropertiesChanged(properties); super.onPropertiesChanged(properties);
mLowBitAmbient = properties.getBoolean(PROPERTY_LOW_BIT_AMBIENT, false); mLowBitAmbient = properties.getBoolean(PROPERTY_LOW_BIT_AMBIENT, false);
mDrawerHelper.setIsLowBitAmbient(mLowBitAmbient);
} }
@Override @Override
@@ -244,9 +182,7 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
super.onAmbientModeChanged(inAmbientMode); super.onAmbientModeChanged(inAmbientMode);
if (mAmbient != inAmbientMode) { if (mAmbient != inAmbientMode) {
mAmbient = inAmbientMode; mAmbient = inAmbientMode;
if (mLowBitAmbient) { mDrawerHelper.setInAmbientMode(inAmbientMode);
mTimeTextPaint.setAntiAlias(!inAmbientMode);
}
invalidate(); invalidate();
} }
@@ -259,30 +195,8 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
@Override @Override
public void onDraw(Canvas canvas, Rect bounds) { public void onDraw(Canvas canvas, Rect bounds) {
// Draw the background.
if (isInAmbientMode()) {
canvas.drawColor(Color.BLACK);
} else {
canvas.drawRect(0, 0, bounds.width(), bounds.height(), mBackgroundPaint);
}
mTime.setToNow(); mTime.setToNow();
// Draw H:MM in ambient mode or H:MM:SS in interactive mode. mDrawerHelper.draw(canvas, bounds, mTime, 25, 16);
String timeText = mAmbient
? String.format("%d:%02d", mTime.hour, mTime.minute)
: String.format("%d:%02d:%02d", mTime.hour, mTime.minute, mTime.second);
canvas.drawText(timeText, mTimeXOffset, mTimeYOffset, mTimeTextPaint);
// Draw current date
String dateText = mTime.format("%a, %b %m %Y");
canvas.drawText(dateText, mDateXOffset, mDateYOffset, mDateTextPaint);
// Draw weather
String currentHigh = "25 \u00b0C";
String currentLow = "16 \u00b0C";
canvas.drawText(currentHigh, mWeatherXOffset, mWeatherYOffset, mHighestTempPaint);
canvas.drawText(currentLow, mWeatherXOffset + mWeatherXOffset2, mWeatherYOffset, mLowestTempPaint);
} }
/** /**

View File

@@ -0,0 +1,120 @@
package com.example.android.sunshine.wear;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.text.format.Time;
public class WatchFaceDrawHelper {
public static final String TIME_FORMAT = "%d:%02d";
public static final String TIME_FORMAT_AMBIENT = "%d:%02d:%02d";
public static final String DATE_FORMAT = "%a, %b %m %Y";
public static final String TEMP_FORMAT= "%1$s°C";
private boolean isInAmbientMode = false;
private boolean isLowBitAmbient = false;
private Paint mBackgroundPaint;
private Paint timeTextPaint;
private Paint mDateTextPaint;
private Paint mHighestTempPaint;
private Paint mLowestTempPaint;
float timeXOffset;
float timeYOffset;
float mDateXOffset;
float mDateYOffset;
float mWeatherYOffset;
float mWeatherXOffset;
float mWeatherXOffset2;
public WatchFaceDrawHelper(Resources resources, boolean isRound) {
timeYOffset = resources.getDimension(R.dimen.time_y_offset);
mDateYOffset = resources.getDimension(R.dimen.date_y_offset);
mWeatherYOffset = resources.getDimension(R.dimen.weather_y_offset);
mBackgroundPaint = new Paint();
mBackgroundPaint.setColor(resources.getColor(R.color.background));
timeTextPaint = createTextPaint(resources.getColor(R.color.textcolor_primary));
mDateTextPaint = createTextPaint(resources.getColor(R.color.textcolor_secondary));
mHighestTempPaint = createTextPaint(resources.getColor(R.color.textcolor_primary));
mHighestTempPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD));
mLowestTempPaint = createTextPaint(resources.getColor(R.color.textcolor_primary));
timeXOffset = resources.getDimension(isRound
? R.dimen.time_x_offset_round : R.dimen.time_x_offset);
mDateXOffset = resources.getDimension(isRound
? R.dimen.date_x_offset_round : R.dimen.date_x_offset);
mWeatherXOffset = resources.getDimension(isRound
? R.dimen.weather_x_offset_round : R.dimen.weather_x_offset);
mWeatherXOffset2 = resources.getDimension(isRound
? R.dimen.weather_x_offset_round_2 : R.dimen.weather_x_offset_2);
float timeTextSize = resources.getDimension(isRound
? R.dimen.time_text_size_round : R.dimen.time_text_size);
timeTextPaint.setTextSize(timeTextSize);
float dateTextSize = resources.getDimension(isRound
? R.dimen.date_text_size_round : R.dimen.date_text_size);
mDateTextPaint.setTextSize(dateTextSize);
float weatherTextSize = resources.getDimension(isRound
? R.dimen.weather_text_size_round : R.dimen.weather_text_size);
mHighestTempPaint.setTextSize(weatherTextSize);
float weatherTextSize2 = resources.getDimension(isRound
? R.dimen.weather_text_size_round_2 : R.dimen.weather_text_size_2);
mLowestTempPaint.setTextSize(weatherTextSize2);
}
private Paint createTextPaint(int textColor) {
Paint paint = new Paint();
paint.setColor(textColor);
paint.setTypeface(Typeface.create(Typeface.SANS_SERIF, Typeface.NORMAL));
paint.setAntiAlias(true);
return paint;
}
public void setInAmbientMode(boolean ambientMode) {
this.isInAmbientMode = ambientMode;
if(isLowBitAmbient)
timeTextPaint.setAntiAlias(!isInAmbientMode);
}
public void setIsLowBitAmbient(boolean isLowBitAmbient) {
this.isLowBitAmbient = isLowBitAmbient;
}
public void draw(Canvas canvas, Rect bounds, Time time, int highestTemp, int lowestTemp) {
// Draw the background.
if (isInAmbientMode) {
canvas.drawColor(Color.BLACK);
} else {
canvas.drawRect(0, 0, bounds.width(), bounds.height(), mBackgroundPaint);
}
time.setToNow();
// Draw H:MM in ambient mode or H:MM:SS in interactive mode.
String timeText = isInAmbientMode
? String.format(TIME_FORMAT, time.hour, time.minute)
: String.format(TIME_FORMAT_AMBIENT, time.hour, time.minute, time.second);
canvas.drawText(timeText, timeXOffset, timeYOffset, timeTextPaint);
// Draw current date
String dateText = time.format(DATE_FORMAT);
canvas.drawText(dateText, mDateXOffset, mDateYOffset, mDateTextPaint);
// Draw weather
String currentHigh = String.format(TEMP_FORMAT, highestTemp);
canvas.drawText(currentHigh, mWeatherXOffset, mWeatherYOffset, mHighestTempPaint);
String currentLow = String.format(TEMP_FORMAT, lowestTemp);
canvas.drawText(currentLow, mWeatherXOffset + mWeatherXOffset2, mWeatherYOffset, mLowestTempPaint);
}
}