我正在使用RelativeLayout
来绝对定位一些标准视图(例如TextView
)。
我想要做的是使用{em>隐藏在之后的RelativeLayout
在Canvas
的{{1}}上绘制自定义行子视图。
这些其他子视图添加时明确定义了Canvas.drawLine
,但我想将的决定留在,将自己绘制到我的自定义行。
我尝试使用重载的RelativeLayout.LayoutParams
方法在自定义视图中包装此行,只需添加视图而不用指定任何View.onDraw(Canvas canvas)
,所以:
LayoutParams
用法:
public class CustomView extends View {
public CustomView(Context context, int x0, int y0, int x1, int y1) {
super(context);
setClickable(false);
setBackgroundColor(Color.TRANSPARENT);
}
public void onDraw(Canvas canvas) {
Log.i("myapp", "i'm not called! :(")
Paint p = new Paint();
p.setColor(Color.BLACK);
canvas.drawLine(x0, y0, x1, y1, p);
}
}
...但永远不会调用此CustomView v = new CustomView(MyActivity.this, 0, 0, 100, 100);
relativeLayout.addView(v);
方法。
有没有办法让这项工作?
修改:如果我替换,则有效:
onDraw
与
relativeLayout.addView(v)
关键是,我当时既不知道relativeLayout.addView(v,
new RelativeLayout.LayoutParams(SOME_WIDTH, SOME_HEIGHT));
也不知道SOME_WIDTH
。
答案 0 :(得分:4)
尝试这个自定义RelativeLayout:
class RL extends RelativeLayout {
private Paint mPaint;
public RL(Context context) {
super(context);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStrokeWidth(5);
mPaint.setColor(0xffffffff);
}
@Override
protected void dispatchDraw(Canvas canvas) {
int cnt = getChildCount();
for (int i = 0; i < cnt; i++) {
View child = getChildAt(i);
int l = child.getLeft();
int t = child.getTop();
int r = child.getRight();
int b = child.getBottom();
if (i % 2 == 0) {
canvas.drawLine(l, t, r, b, mPaint);
} else {
canvas.drawLine(l, b, r, t, mPaint);
}
}
super.dispatchDraw(canvas);
}
}
并测试它在onCreate()方法中添加以下内容:
RelativeLayout rl = new RL(this);
TextView tv;
List<String> list = Arrays.asList("one", " two ", "three", " four ", "fife");
int i = 0;
for (String string : list) {
int id = 1000 + i;
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
if (i != 0) {
params.addRule(RL.BELOW, id - 1);
}
tv = new TextView(this);
tv.setTextSize(48);
tv.setTextColor(0xffff0000);
tv.setText(string);
rl.addView(tv, params);
tv.setId(id);
i++;
}
setContentView(rl);
答案 1 :(得分:0)
所以
我最终创建了一个CustomController
,它有一些计算位置/大小的方法,并在为每个RelativeLayout.LayoutParams
创建CustomView(context, controller)
时使用此控制器。
我猜你在RelativeLayout
中没有指定其RelativeLayout.LayoutParams
的子视图。
答案 2 :(得分:0)
最简单的方法是在super.draw(Canvas)
方法完成后台后调用onDraw()
方法。
这将导致它最后吸引孩子们。