watchface scaffold

This commit is contained in:
danijoo
2015-12-03 14:28:31 +01:00
parent 059200095c
commit e8c999a36b
3 changed files with 88 additions and 47 deletions

View File

@@ -21,6 +21,8 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
@@ -87,7 +89,10 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
final Handler mUpdateTimeHandler = new EngineHandler(this);
boolean mRegisteredTimeZoneReceiver = false;
Paint mBackgroundPaint;
Paint mTextPaint;
Paint mTimeTextPaint;
Paint mDateTextPaint;
Paint mHighestTempPaint;
Paint mLowestTempPaint;
boolean mAmbient;
Time mTime;
final BroadcastReceiver mTimeZoneReceiver = new BroadcastReceiver() {
@@ -97,10 +102,13 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
mTime.setToNow();
}
};
int mTapCount;
float mXOffset;
float mYOffset;
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
@@ -119,13 +127,19 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
.setAcceptsTapEvents(true)
.build());
Resources resources = SunshineWatchFaceService.this.getResources();
mYOffset = resources.getDimension(R.dimen.digital_y_offset);
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));
mTextPaint = new Paint();
mTextPaint = createTextPaint(resources.getColor(R.color.digital_text));
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();
}
@@ -187,12 +201,30 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
// Load resources that have alternate values for round watches.
Resources resources = SunshineWatchFaceService.this.getResources();
boolean isRound = insets.isRound();
mXOffset = resources.getDimension(isRound
? R.dimen.digital_x_offset_round : R.dimen.digital_x_offset);
float textSize = resources.getDimension(isRound
? R.dimen.digital_text_size_round : R.dimen.digital_text_size);
mTimeXOffset = 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);
mTextPaint.setTextSize(textSize);
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
@@ -213,7 +245,7 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
if (mAmbient != inAmbientMode) {
mAmbient = inAmbientMode;
if (mLowBitAmbient) {
mTextPaint.setAntiAlias(!inAmbientMode);
mTimeTextPaint.setAntiAlias(!inAmbientMode);
}
invalidate();
}
@@ -223,29 +255,7 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
updateTimer();
}
/**
* Captures tap event (and tap type) and toggles the background color if the user finishes
* a tap.
*/
@Override
public void onTapCommand(int tapType, int x, int y, long eventTime) {
Resources resources = SunshineWatchFaceService.this.getResources();
switch (tapType) {
case TAP_TYPE_TOUCH:
// The user has started touching the screen.
break;
case TAP_TYPE_TOUCH_CANCEL:
// The user has started a different gesture or otherwise cancelled the tap.
break;
case TAP_TYPE_TAP:
// The user has completed the tap gesture.
mTapCount++;
mBackgroundPaint.setColor(resources.getColor(mTapCount % 2 == 0 ?
R.color.background : R.color.background2));
break;
}
invalidate();
}
@Override
public void onDraw(Canvas canvas, Rect bounds) {
@@ -256,12 +266,23 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
canvas.drawRect(0, 0, bounds.width(), bounds.height(), mBackgroundPaint);
}
// Draw H:MM in ambient mode or H:MM:SS in interactive mode.
mTime.setToNow();
String text = mAmbient
// Draw H:MM in ambient mode or H:MM:SS in interactive mode.
String timeText = mAmbient
? String.format("%d:%02d", mTime.hour, mTime.minute)
: String.format("%d:%02d:%02d", mTime.hour, mTime.minute, mTime.second);
canvas.drawText(text, mXOffset, mYOffset, mTextPaint);
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

@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="background">#000000</color>
<color name="background">#1ca8f4</color>
<color name="background2">#000088</color>
<color name="digital_text">#ffffff</color>
<color name="textcolor_primary">#ffffff</color>
<color name="textcolor_secondary">#ddd</color>
</resources>

View File

@@ -1,8 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="digital_text_size">40dp</dimen>
<dimen name="digital_text_size_round">45dp</dimen>
<dimen name="digital_x_offset">15dp</dimen>
<dimen name="digital_x_offset_round">25dp</dimen>
<dimen name="digital_y_offset">90dp</dimen>
<dimen name="time_text_size">40dp</dimen>
<dimen name="time_text_size_round">45dp</dimen>
<dimen name="time_x_offset">15dp</dimen>
<dimen name="time_x_offset_round">25dp</dimen>
<dimen name="time_y_offset">70dp</dimen>
<dimen name="date_text_size">20dp</dimen>
<dimen name="date_text_size_round">25dp</dimen>
<dimen name="date_x_offset">15dp</dimen>
<dimen name="date_x_offset_round">25dp</dimen>
<dimen name="date_y_offset">100dp</dimen>
<dimen name="weather_text_size">20dp</dimen>
<dimen name="weather_text_size_round">25dp</dimen>
<dimen name="weather_text_size_2">15dp</dimen>
<dimen name="weather_text_size_round_2">20dp</dimen>
<dimen name="weather_x_offset">45dp</dimen>
<dimen name="weather_x_offset_round">55dp</dimen>
<dimen name="weather_x_offset_2">70dp</dimen>
<dimen name="weather_x_offset_round_2">100dp</dimen>
<dimen name="weather_y_offset">140dp</dimen>
<dimen name="weather_indicator_size">40dp</dimen>
</resources>