私は速度計を作っており、setTranslation() を介して針を中心に置いています。ランドスケープ モードではすべてがほぼ正常に機能しますが、エミュレータの向きをポートレートに変更すると、針は左 + top(+x, +y) に向かってオフセットします。
私のビットマップオブジェクトのサイズは次のとおりです。
speedo_meter (高さ x 幅): 89 x 20
針(高さ×幅):344×313
しかし、getWidth() と getHeight を使用して Log.d で表示すると、値が異なります (LogCat の質問の最後を参照してください)。
ポートレートモードでの値とオフセットの違いの原因を説明できる人はいますか?
これが私がやろうとしていることの例です:
マトリックスを含む onDraw() メソッドは次のとおりです。
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(speedo_meter, (canvas.getWidth() / 2) - speedo_meter.getWidth() / 2,
(canvas.getHeight() / 3) - speedo_meter.getHeight() / 2, null);
// Main Meter Needle
matrix_needle.setTranslate((canvas.getWidth() / 2) - needle.getWidth() / 2,
(canvas.getHeight() / 3)- needle.getHeight());
// Log.d("ANGLE OF DEVIATION : ","" + angle_of_deviation);
Log.d("CANVAS HEIGHT : ","" + canvas.getHeight());
Log.d("CANVAS WIDTH : ","" + canvas.getWidth());
Log.d("METER HEIGHT : ","" + speedo_meter.getHeight());
Log.d("METER WIDTH : ","" + speedo_meter.getWidth());
Log.d("NEEDLE HEIGHT : ","" + needle.getHeight());
Log.d("NEEDLE WIDTH : ","" + needle.getWidth());
Log.d("MATRIX : ","" + matrix_needle.toString());
matrix_needle.postRotate(angle_of_deviation, canvas.getWidth() / 2, 2 * needle.getHeight() - 10);
canvas.drawBitmap(needle, matrix_needle, paint_needle);
// Main Meter Wheel
canvas.drawBitmap(center_wheel, (canvas.getWidth() / 2)- center_wheel.getWidth() / 2,
(canvas.getHeight() / 3)- center_wheel.getHeight() / 2, null);
}
次のようなカスタム ビューを作成しています。
public SpeedometerView(Context context) {
super(context);
initializeView(context);
}
public SpeedometerView(Context context, AttributeSet attrs) {
super(context, attrs);
initializeView(context);
}
public SpeedometerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initializeView(context);
}
//Create view
private void initializeView(Context context) {
this.context = context;
speedo_obj = this;
this.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
releaseImageResources();
speedo_meter = getImage(R.drawable.meter);
center_wheel = getImage(R.drawable.center_wheel);
needle = getImage(R.drawable.arrow);
paint_needle = new Paint();
paint_needle.setStyle(Paint.Style.FILL);
paint_needle.setAntiAlias(true);
}
そして、これはカスタム ビューを使用した私のレイアウト XML です。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.speedometer.view.SpeedometerView
android:id="@+id/speedometer_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_marginTop="40dip" >
</com.mobisoft.view.SpeedometerView>
<Button
android:id="@+id/change_needle_value_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="@string/move_needle" />
</RelativeLayout>
Log.d 経由で取得した関連エントリ:
風景モード:
03-28 16:50:19.033: D/CANVAS HEIGHT :(2859): 487
03-28 16:50:19.033: D/CANVAS WIDTH :(2859): 1024
03-28 16:50:19.033: D/METER HEIGHT :(2859): 229
03-28 16:50:19.033: D/METER WIDTH :(2859): 209
03-28 16:50:19.033: D/NEEDLE HEIGHT :(2859): 59
03-28 16:50:19.033: D/NEEDLE WIDTH :(2859): 13
03-28 16:50:19.033: D/MATRIX :(2859): Matrix{[1.0, 0.0, 506.0][0.0, 1.0, 103.0][0.0, 0.0, 1.0]}
ポートレートモード:
03-28 16:50:19.033: D/CANVAS HEIGHT :(2859): 911
03-28 16:50:19.033: D/CANVAS WIDTH :(2859): 600
03-28 16:50:19.033: D/METER HEIGHT :(2859): 229
03-28 16:50:19.033: D/METER WIDTH :(2859): 209
03-28 16:50:19.033: D/NEEDLE HEIGHT :(2859): 59
03-28 16:50:19.033: D/NEEDLE WIDTH :(2859): 13
03-28 16:50:19.033: D/MATRIX :(2859): Matrix{[1.0, 0.0, 294.0][0.0, 1.0, 244.0][0.0, 0.0, 1.0]}