为什么编辑LayoutParams尺寸时不具有画布尺寸的效果
我正在处理扩展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()
时,宽度不变。 为什么视图大小不变?这与画布没有改变的原因是一样的吗?我能做些什么来解决它?
我找到理由为自己。
我没有提到什么 - 我认为不重要 - 我通过其他线程调用了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线程的正确方式,但无论我尝试过什么,我都无法顺利地更改视图参数。
一些解决方法来实现滑动菜单:
- DO [安卓导航抽屉] [4] - 你可以用restictions custiomize它例如您不能使导航抽屉从顶部移动。
- 使用[Android动画] [5] - 使用它您可以移动或缩放视图,但无法调整其大小。
我不能把超过2个链接我的名声:
(4):developer.android.com/training/implementing-navigation/nav-drawer.html
( 5):developer.android.com/training/animation/index。html
通过做getLayoutParams().width = width;
您正在更改View
的布局参数。但是您正在执行Canvas
的绘图,该图拥有SurfaceHolder
,而不是普通的View
将提供给您的那个。
因此,为了改变SurfaceView
的大小,你必须与SurfaceHolder
互动:
surfaceView.getHolder().setFixedSize(width, height);
我在两个地方尝试过:1)在'setLayoutParams(...)'后的'changeSize()'中,以及2)在'draw()'方法中。两者不能像[setSizeFromLayout()](https://developer.android.com/reference/android/view/SurfaceHolder.html#setSizeFromLayout())一样工作,它可以提供与布局相同的大小。 – lvl7
只要[SurfaceHolder#Callback#surfaceCreated(SurfaceHolder)](https://developer.android.com/reference/android/view/SurfaceHolder.Callback.html)被触发,'SurfaceHolder'将被访问。你从那里试过了吗? – azizbekian