为什么编辑LayoutParams大小不具有画布大小的效果

时间:2017-04-19 13:25:33

标签: android canvas layoutparams

我正在处理扩展SurfaceView的幻灯片菜单视图,但是当我尝试更改视图的大小时,画布不会改变。

出于调试目的,我正在改变视图调用方法的大小:

public void changeSize() {
    width += 10;
    getLayoutParams().width = width;
    this.setLayoutParams(getLayoutParams());
}

然后在绘图功能中,我将画布画成白色,并在视图上沿对角线绘制红线:

public void draw() throws Exception {
  SurfaceHolder surfaceHolder = getHolder();
  if (surfaceHolder.getSurface().isValid()) {
    Canvas canvas = surfaceHolder.lockCanvas();
    Log.i(TAG, "draw > canvas size: " + canvas.getWidth() + " " + canvas.getHeight() );
    paint.setColor(Color.rgb(255,0,0));
    paint.setStrokeWidth(5);
    canvas.drawColor(Color.rgb(255, 255, 255));
    canvas.drawLine(0, getLayoutParams().height, getLayoutParams().width, 0, paint);

    surfaceHolder.unlockCanvasAndPost(canvas);
  }
}

我看到的是一个白色矩形,大小固定,部分为红线: demo

另外,当我拨打this.getWidth()时,我的宽度不变。 为什么视图大小不变?画布没有改变的原因是什么?我该怎么做才能解决它?

2 个答案:

答案 0 :(得分:1)

我找到了自己的理由。

我没有提及某些事情 - 我认为这并不重要 - 我通过其他线程调用changeSize()而不是创建视图,因为:Only the original thread that created a view hierarchy can touch its views这是不允许的。这个问题很多时候都解决了,例如here

我可以使用Activity.runOnUiThread()方法,但我不想将Activity传递给视图,因此我在changeSize()中使用View.post()方法,如下所示:

Runnable changeParams = new Runnable() {
  @Override
  public void run() {
    getLayoutParams().width = width;
    setLayoutParams(getLayoutParams());
  }
};
this.post(changeParams);

<强>更新

也许我不知道使用UI线程的正确方法,但无论我尝试什么,我都无法顺利更改视图参数。

实现幻灯片菜单的一些解决方法:

  1. 执行[Android导航抽屉] [4] - 您可以使用重新定位来进行自定义,例如你不能让导航抽屉从顶部移动。
  2. 使用[Android动画] [5] - 使用它可以移动或缩放视图,但无法调整大小。
  3. 我的名声不能超过2个链接:

    (4):developer.android.com/training/implementing-navigation/nav-drawer.html

    (5):developer.android.com/training/animation/index.html

答案 1 :(得分:0)

通过执行getLayoutParams().width = width;,您正在更改View的布局参数。但是,您在拥有Canvas的{​​{1}}上进行绘图,而不是普通SurfaceHolder将为您提供的绘图。

因此,为了更改View的尺寸,您必须与SurfaceView进行互动:

SurfaceHolder