在RelativeLayout中部分绘制的自定义视图
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在RelativeLayout中部分绘制的自定义视图相关的知识,希望对你有一定的参考价值。
我想使用自定义视图在我的活动的根布局(RelativeLayout)上绘制一个正方形。但是,当x!= 0或y!= 0时,只会部分绘制正方形。
当x = 0且y = 0(3x3网格由另一个自定义视图绘制)时
当x = 100且y = 0时
我也设置了它的onTouchListener,当我点击红线包围的区域时,它仍然会被触发。但我不知道为什么视图的X和Y与所示方块的X和Y不一致。
将我的视图添加到布局的代码
PieceView view = new PieceView(this, x, y, widthOfSquare, 0xFF5DADE2);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(widthOfSquare, widthOfSquare);
layoutParams.leftMargin = (int)x;
layoutParams.topMargin = (int)y;
view.setLayoutParams(layoutParams);
rootLayout.addView(view);
我的自定义视图
public class PieceView extends View{
private static final int strokeWidth = 5;
private Paint paint;
private RectF rect;
public PieceView(Context context, float x, float y, float size, int color) {
super(context);
init(x, y, size, color);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int desiredWidth = (int)rect.width();
int desiredHeight = (int)rect.height();
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int width;
int height;
//Measure Width
if (widthMode == MeasureSpec.EXACTLY) {
//Must be this size
width = widthSize;
} else if (widthMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
width = Math.min(desiredWidth, widthSize);
} else {
//Be whatever you want
width = desiredWidth;
}
//Measure Height
if (heightMode == MeasureSpec.EXACTLY) {
//Must be this size
height = heightSize;
} else if (heightMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
height = Math.min(desiredHeight, heightSize);
} else {
//Be whatever you want
height = desiredHeight;
}
setMeasuredDimension(width, height);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRect(rect, paint);
}
private void init(float x, float y, float size, int color){
paint = new Paint();
rect = new RectF(x, y, x + size, y + size);
paint.setColor(color);
paint.setStrokeWidth(strokeWidth);
}
}
另外,我想知道我是否应该使用
layoutParams.leftMargin = (int)x;
layoutParams.topMargin = (int)y;
或者我应该使用
view.setX(x)
view.setY(y)
指定我的方块的位置。如果我将其添加到的ViewGroup是具有match_parent = true
的RelativeLayout并且它是Activity的根布局,那么两种方法之间是否有所不同?
我已经被困了几个小时,非常感谢任何建议。
答案
事实证明问题是关于坐标。在onDraw()中,canvas的坐标系是View,而不是全局坐标系。例如,如果View.x = 100,View.y = 0,那么onDraw()中的代码将在全局坐标系中绘制一个左上角为(100 + 100,0)的矩形。
以上是关于在RelativeLayout中部分绘制的自定义视图的主要内容,如果未能解决你的问题,请参考以下文章
将视图附加到Android中的自定义RelativeLayout
创建具有与宽度相关的高度的自定义RelativeLayout
从自定义视图访问 RelativeLayout 时出现 NullPointerException