2017-04-19 62 views
2

我正在处理扩展SurfaceView的幻灯片菜单视图,但是当我尝试更改视图的大小时画布不会更改。为什么编辑LayoutParams尺寸时不具有画布尺寸的效果

调试目的,我改变了看法调用方法的大小:平局功能

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()时,宽度不变。 为什么视图大小不变?这与画布没有改变的原因是一样的吗?我能做些什么来解决它?

回答

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. DO [安卓导航抽屉] [4] - 你可以用restictions custiomize它例如您不能使导航抽屉从顶部移动。
  2. 使用[Android动画] [5] - 使用它您可以移动或缩放视图,但无法调整其大小。

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

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

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

0

通过做getLayoutParams().width = width;您正在更改View的布局参数。但是您正在执行Canvas的绘图,该图拥有SurfaceHolder,而不是普通的View将提供给您的那个。

因此,为了改变SurfaceView的大小,你必须与SurfaceHolder互动:

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

我在两个地方尝试过:1)在'setLayoutParams(...)'后的'changeSize()'中,以及2)在'draw()'方法中。两者不能像[setSizeFromLayout()](https://developer.android.com/reference/android/view/SurfaceHolder.html#setSizeFromLayout())一样工作,它可以提供与布局相同的大小。 – lvl7

+0

只要[SurfaceHolder#Callback#surfaceCreated(SurfaceHolder)](https://developer.android.com/reference/android/view/SurfaceHolder.Callback.html)被触发,'SurfaceHolder'将被访问。你从那里试过了吗? – azizbekian