我正在尝试在屏幕上显示几个相同的自定义视图。这是我的视图类:
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
任何值,我总是会得到相同的值。屏幕上只有一个视图(或全部,但在模型之上)。
导致仅绘制一个视图的错误在哪里?