【问题标题】:Why editing LayoutParams size doesn't have the effect of a canvas size为什么编辑 LayoutParams 大小没有画布大小的效果
【发布时间】:2017-05-05 21:53:18
【问题描述】:

我正在处理扩展 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() 时,宽度不变。 为什么视图大小没有变化?画布没有变化是不是同一个原因?我能做些什么来解决它?

【问题讨论】:

    标签: android canvas layoutparams


    【解决方案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] -- 使用它您可以移动或缩放视图,但不能调整其大小。

    我的声誉不能超过 2 个链接:

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

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

    【讨论】:

      【解决方案2】:

      通过执行getLayoutParams().width = width;,您正在更改View 的布局参数。但是您正在使用拥有SurfaceHolderCanvas 进行绘图,而不是普通的View 将提供给您的。

      所以,为了改变SurfaceView的大小,你必须与SurfaceHolder进行交互:

      surfaceView.getHolder().setFixedSize(width, height);
      

      【讨论】:

      猜你喜欢
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多