我想实现一个表盘,其中一只手的位图图像有关的脸在画布上的中心旋转。
- 基本上在的onDraw()方法,我希望能够把图像资源到画布上,然后将其旋转旋转,它的每一秒。
- 我有逻辑的地方触发旋转每一秒,我不知道如何获取图像资源,然后将其旋转。
任何帮助将appriciated!
我想实现一个表盘,其中一只手的位图图像有关的脸在画布上的中心旋转。
任何帮助将appriciated!
基本步骤:
从解码,例如,资源的位图,但也有其他办法。 (您想初始化类时,不是每次抽奖周期做一次。):
Bitmap = mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.watch_face);
建立一个Matrix
内onDraw
的旋转。 就像是:
Matrix mMatrix = new Matrix(); mMatrix.setRotate (degreeOfRotation, mBitmap.getWidth()/2, mBitmap.getHeight()/2);
使用需要在你的矩阵的方法绘制位图: canvas.drawBitmap(mBitmap, mMatrix, mPaint);
还有其他的细节。 建立Paint
。 你会发现你需要使用矩阵的postRotate
方法来代替。 等等,等等但是,这应该足够你开始使然。
在这种特定情况下(我想你想旋转与谷歌表盘API位图),你应该在描述心中的规则这个辉煌的职位 ,并避免使用大位图手表的指针。 这意味着你必须指定垂直和水平的利润率。 我使用java的发布解决方案在这里 。
yourCanvas.save(Canvas.MATRIX_SAVE_FLAG); //Save the canvas
yourCanvas.rotate(currentRotation, centerX, centerY);
int marginX = (width - yourBitmap.getWidth()) / 2; //Calculate horizontal margin
yourCanvas.drawBitmap(yourBitmap, marginX, 0, yourPaint);
yourCanvas.restore();
我放弃了垂直裁剪位图,因为它更容易这种方式旋转它,但它应该考虑,如果你想在完全符合规则作出。 它甚至会更好,不算marginX
这里。 它可以在完成onSurfaceChanged
,如在上面提到的后说明。
我最近需要解决位图的旋转问题对于Android Wear表盘。 下面的onDraw代码为我工作。 要确保你的位图的onDraw之前调用缩放:
// first draw the background
if (isInAmbientMode()) {
canvas.drawColor(Color.BLACK);
} else {
if (mBackgroundBitmapScaled == null) {
canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), mBackgroundPaint);
}
else {
canvas.drawBitmap(mBackgroundBitmapScaled, 0, 0, null);
}
}
// now setup to draw the hands..
float centerX = bounds.width() / 2f;
float centerY = bounds.height() / 2f;
float secRot = mCalendar.get(Calendar.SECOND) / 30f * (float) Math.PI;
int minutes = mCalendar.get(Calendar.MINUTE);
float minRot = minutes / 30f * (float) Math.PI;
float hrRot = ((mCalendar.get(Calendar.HOUR) + (minutes / 60f)) / 6f) * (float) Math.PI;
if (isInAmbientMode()) {
mHandPaint.clearShadowLayer();
float minLength = centerX - 40;
float hrLength = centerX - 80;
// hour hand
float hrX = (float) Math.sin(hrRot) * hrLength;
float hrY = (float) -Math.cos(hrRot) * hrLength;
canvas.drawLine(centerX, centerY, centerX + hrX, centerY + hrY, mHandPaint);
// minute hand
float minX = (float) Math.sin(minRot) * minLength;
float minY = (float) -Math.cos(minRot) * minLength;
canvas.drawLine(centerX, centerY, centerX + minX, centerY + minY, mHandPaint);
}
else {
// hour hand
Matrix matrix = new Matrix();
matrix.setRotate (hrRot / (float) Math.PI * 180, mHourHandBitmapScaled.getWidth()/2, mHourHandBitmapScaled.getHeight()/2);
canvas.drawBitmap(mHourHandBitmapScaled, matrix, mHandPaint);
// minute hand
matrix = new Matrix();
matrix.setRotate (minRot / (float) Math.PI * 180, mHourHandBitmapScaled.getWidth()/2, mHourHandBitmapScaled.getHeight()/2);
canvas.drawBitmap(mMinuteHandBitmapScaled, matrix, mHandPaint);
}
if (!mAmbient) {
// second hand
float secLength = centerX - 20;
float secX = (float) Math.sin(secRot) * secLength;
float secY = (float) -Math.cos(secRot) * secLength;
canvas.drawLine(centerX, centerY, centerX + secX, centerY + secY, mHandPaint);
}
和比例:
private void scaleWatchFace(int width, int height) {
Log.v(TAG, "scaleWatchFace");
mBackgroundBitmapScaled = Bitmap.createScaledBitmap(mBackgroundBitmap, width, height, true /* filter */);
float ratio = (float) width / mBackgroundBitmap.getWidth();
mMinuteHandBitmapScaled = Bitmap.createScaledBitmap(mMinuteHandBitmap,
(int) (mMinuteHandBitmap.getWidth() * ratio),
(int) (mMinuteHandBitmap.getHeight() * ratio), true);
mHourHandBitmapScaled = Bitmap.createScaledBitmap(mHourHandBitmap,
(int) (mHourHandBitmap.getWidth() * ratio),
(int) (mHourHandBitmap.getHeight() * ratio), true);
}
请注意,我的背景和表针资源的图像尺寸都小480x480。 这消除了任何需要翻译中心,(可能)是电池容易。
我希望这是有益的。