Android API 3:シンプルなカスタムスクエアコンポーネント
-
26-10-2019 - |
質問
カスタムブルースクエアコンポーネントをコーディングしようとしました。
- 幅または高さは、親レイアウトで親を埋めるように言うときはいつでも親サイズです(res/layout/main.xmlとしましょう)
- 幅または高さは、親レイアウトでコンテンツをラップするように言うたびに30 px(または30 dpiが優れていますか?)です。
今のところ、Rajesh.ediのおかげで、私はなんとか青い正方形をペイントすることができました。しかし、どちらの場合もサイズは30px * 30pxです(親コンテンツまたはラップの内容を入力します)。それで、サイズを適応させることができるように、モード「ラップコンテンツ」とモード「充填親」を検出する方法はありますか?
コンポーネントの私の試みは次のとおりです(この青い正方形はチェスボードコンポーネントを作る前のプレリマリーステップであるため、ボードビューと呼ばれます):
package com.gmail.bernabe.laurent.android.simple_chess_board.views;
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.View;
public class BoardView extends View {
public BoardView(Context context) {
super(context);
setBackgroundColor(Color.BLUE);
}
public BoardView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public BoardView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
int newWidth, newHeight;
if (widthSpecMode == MeasureSpec.EXACTLY)
newWidth = 30;
else
newWidth = MeasureSpec.getSize(widthMeasureSpec);
if (heightSpecMode == MeasureSpec.EXACTLY)
newHeight = 30;
else
newHeight = MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(newWidth, newHeight);
}
@Override
protected void onDraw(Canvas canvas) {
Rect rect = new Rect(0, 0, getWidth(), getHeight());
Paint paint = new Paint();
paint.setColor(Color.BLUE);
canvas.drawRect(rect, paint);
}
}
そして、これが私のmain.xmlです
<com.gmail.bernabe.laurent.android.simple_chess_board.views.BoardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/boardView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
エラーは、私がview.ondraw()を無効にしなかったという事実から生じなかったと確信していました。しかし、私は間違っていました。なんで ?なぜ背景色を青に設定するだけでは不十分ですか?
誰かが私を助けることができれば、事前に感謝します。
解決
最後に、ユーザーがwrap_contentに設定したときはいつでも、modeをモードとして取得します。
package com.gmail.bernabe.laurent.android.simple_chess_board.views;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
public class BoardView extends View {
public BoardView(Context context) {
super(context);
}
public BoardView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public BoardView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
int widthMeasure = MeasureSpec.getSize(widthMeasureSpec);
int heightMeasure = MeasureSpec.getSize(heightMeasureSpec);
int newWidth, newHeight;
if (widthSpecMode == MeasureSpec.AT_MOST)
newWidth = 30;
else
newWidth = widthMeasure;
if (heightSpecMode == MeasureSpec.AT_MOST)
newHeight = 30;
else
newHeight = heightMeasure;
setMeasuredDimension(newWidth, newHeight);
}
@Override
protected void onDraw(Canvas canvas) {
Rect rect = new Rect(0, 0, getWidth(), getHeight());
Paint paint = new Paint();
paint.setColor(Color.BLUE);
canvas.drawRect(rect, paint);
}
}
所属していません StackOverflow