我正在处理扩展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()
时,我的宽度不变。
为什么视图大小不变?画布没有改变的原因是什么?我该怎么做才能解决它?
答案 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线程的正确方法,但无论我尝试什么,我都无法顺利更改视图参数。
实现幻灯片菜单的一些解决方法:
我的名声不能超过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