画面に同じカスタム ビューをいくつか表示しようとしています。ここに私のビュークラスがあります:
public class DraggableText extends View {
private int cStart;
private int cEnd;
private Paint mTextPaint, mBgPaint;
private RectF mRect;
private Point mPos;
public DraggableText(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.getTheme().obtainStyledAttributes(attrs,
R.styleable.DraggableText, 0, 0);
try {
cStart = Color.parseColor(a
.getString(R.styleable.DraggableText_gradientStart));
cEnd = Color.parseColor(a
.getString(R.styleable.DraggableText_gradientEnd));
} finally {
a.recycle();
}
init();
}
private void init() {
mBgPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
Shader s = new LinearGradient(0, 0, 0, getHeight(), cStart, cEnd,
Shader.TileMode.CLAMP);
mBgPaint.setShader(s);
mRect = new RectF();
mPos = new Point(0, 0);
}
public void setPos(Point p){
mPos = p;
invalidate();
requestLayout();
}
public Point getPos(){
return mPos;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int desiredWidth = (widthSize / 2) - 80;
int desiredHeight = 65;
int width;
int height;
if (widthMode == MeasureSpec.EXACTLY) {
width = widthSize;
} else if (widthMode == MeasureSpec.AT_MOST) {
width = Math.min(desiredWidth, widthSize);
} else {
width = desiredWidth;
}
if (heightMode == MeasureSpec.EXACTLY) {
height = heightSize;
} else if (heightMode == MeasureSpec.AT_MOST) {
height = Math.min(desiredHeight, heightSize);
} else {
height = desiredHeight;
}
setMeasuredDimension(width, height);
}
@Override
protected void onDraw(Canvas c) {
super.onDraw(c);
mRect.set(mPos.x, mPos.y, getWidth(), getHeight());
c.drawRoundRect(mRect, 8, 8, mBgPaint);
}
}
onCreate
コールバックのアクティビティでは、次のようにします。
word1 = (DraggableText) findViewById(R.id.word1);
word2 = (DraggableText) findViewById(R.id.word2);
word3 = (DraggableText) findViewById(R.id.word3);
word4 = (DraggableText) findViewById(R.id.word4);
word1.post(new Runnable() {
@Override
public void run() {
word1.setPos(new Point(20, 20));
word2.setPos(new Point(word1.getWidth() + 20, 20));
word3.setPos(new Point(20, word1.getHeight() + 10));
word4.setPos(new Point(word1.getWidth() + 20, word1.getHeight() + 10));
}
});
getWidth
ビューにアクセスできるように、この実行可能ファイルを投稿しgetHeight
ます。ポイントではありません。このコードを削除してsetPos
、どんな値でも使用すると、常に同じになります。画面上の 1 つのビューのみ (またはすべて、ただし前者の上)。
1 つのビューのみを描画するバグはどこにありますか?