在所有其他视图后面的RelativeLayout Canvas上绘图?

时间:2013-12-21 14:39:47

标签: android android-layout

我正在使用RelativeLayout来绝对定位一些标准视图(例如TextView)。

我想要做的是使用{em>隐藏在之后的RelativeLayoutCanvas的{​​{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

3 个答案:

答案 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()方法。 这将导致它最后吸引孩子们。