watchface scaffold
This commit is contained in:
@@ -21,6 +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.Color;
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
@@ -87,7 +89,10 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
|
|||||||
final Handler mUpdateTimeHandler = new EngineHandler(this);
|
final Handler mUpdateTimeHandler = new EngineHandler(this);
|
||||||
boolean mRegisteredTimeZoneReceiver = false;
|
boolean mRegisteredTimeZoneReceiver = false;
|
||||||
Paint mBackgroundPaint;
|
Paint mBackgroundPaint;
|
||||||
Paint mTextPaint;
|
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() {
|
||||||
@@ -97,10 +102,13 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
|
|||||||
mTime.setToNow();
|
mTime.setToNow();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
int mTapCount;
|
float mTimeXOffset;
|
||||||
|
float mTimeYOffset;
|
||||||
float mXOffset;
|
float mDateXOffset;
|
||||||
float mYOffset;
|
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
|
||||||
@@ -119,13 +127,19 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
|
|||||||
.setAcceptsTapEvents(true)
|
.setAcceptsTapEvents(true)
|
||||||
.build());
|
.build());
|
||||||
Resources resources = SunshineWatchFaceService.this.getResources();
|
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 = new Paint();
|
||||||
mBackgroundPaint.setColor(resources.getColor(R.color.background));
|
mBackgroundPaint.setColor(resources.getColor(R.color.background));
|
||||||
|
|
||||||
mTextPaint = new Paint();
|
mTimeTextPaint = createTextPaint(resources.getColor(R.color.textcolor_primary));
|
||||||
mTextPaint = createTextPaint(resources.getColor(R.color.digital_text));
|
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();
|
||||||
}
|
}
|
||||||
@@ -187,12 +201,30 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
|
|||||||
// Load resources that have alternate values for round watches.
|
// 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();
|
||||||
mXOffset = resources.getDimension(isRound
|
mTimeXOffset = resources.getDimension(isRound
|
||||||
? R.dimen.digital_x_offset_round : R.dimen.digital_x_offset);
|
? R.dimen.time_x_offset_round : R.dimen.time_x_offset);
|
||||||
float textSize = resources.getDimension(isRound
|
mDateXOffset = resources.getDimension(isRound
|
||||||
? R.dimen.digital_text_size_round : R.dimen.digital_text_size);
|
? 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
|
@Override
|
||||||
@@ -213,7 +245,7 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
|
|||||||
if (mAmbient != inAmbientMode) {
|
if (mAmbient != inAmbientMode) {
|
||||||
mAmbient = inAmbientMode;
|
mAmbient = inAmbientMode;
|
||||||
if (mLowBitAmbient) {
|
if (mLowBitAmbient) {
|
||||||
mTextPaint.setAntiAlias(!inAmbientMode);
|
mTimeTextPaint.setAntiAlias(!inAmbientMode);
|
||||||
}
|
}
|
||||||
invalidate();
|
invalidate();
|
||||||
}
|
}
|
||||||
@@ -223,29 +255,7 @@ public class SunshineWatchFaceService extends CanvasWatchFaceService {
|
|||||||
updateTimer();
|
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
|
@Override
|
||||||
public void onDraw(Canvas canvas, Rect bounds) {
|
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);
|
canvas.drawRect(0, 0, bounds.width(), bounds.height(), mBackgroundPaint);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw H:MM in ambient mode or H:MM:SS in interactive mode.
|
|
||||||
mTime.setToNow();
|
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", mTime.hour, mTime.minute)
|
||||||
: String.format("%d:%02d:%02d", mTime.hour, mTime.minute, mTime.second);
|
: 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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<color name="background">#000000</color>
|
<color name="background">#1ca8f4</color>
|
||||||
<color name="background2">#000088</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>
|
</resources>
|
||||||
|
|||||||
@@ -1,8 +1,27 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<dimen name="digital_text_size">40dp</dimen>
|
<dimen name="time_text_size">40dp</dimen>
|
||||||
<dimen name="digital_text_size_round">45dp</dimen>
|
<dimen name="time_text_size_round">45dp</dimen>
|
||||||
<dimen name="digital_x_offset">15dp</dimen>
|
<dimen name="time_x_offset">15dp</dimen>
|
||||||
<dimen name="digital_x_offset_round">25dp</dimen>
|
<dimen name="time_x_offset_round">25dp</dimen>
|
||||||
<dimen name="digital_y_offset">90dp</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>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user