Java SurfaceView、onDraw和postInvalidate()有什么问题吗
这个应用程序表现得很奇怪。我有一个类扩展了SurfaceView并实现了SurfaceHolder.Callback。 我尝试了3种代码选项,其中只有一种能满足我的需要,但我怀疑这是一种正确的解决方案,而另一种则有不同的行为。所以,我的问题是为什么和什么是错误的,如果正确的解决方案是错误的,那么为什么它是有效的… 人人享有的权利: 我尝试设置WillNotDrawBoolean标志flagtrue/false 在清单集中android:changeConfiguration=orientation 在主布局中,使用通过xml资源定义的平铺图片设置背景。 现在,正确的实施方法是: 我有线程调用postInvalidate;lockCanvas和unlockCanvas之间存在延迟和调用: 我的onDraw和drawCanvas c,int deg在所有变化中均相同:Java SurfaceView、onDraw和postInvalidate()有什么问题吗,java,android,surfaceview,ondraw,Java,Android,Surfaceview,Ondraw,这个应用程序表现得很奇怪。我有一个类扩展了SurfaceView并实现了SurfaceHolder.Callback。 我尝试了3种代码选项,其中只有一种能满足我的需要,但我怀疑这是一种正确的解决方案,而另一种则有不同的行为。所以,我的问题是为什么和什么是错误的,如果正确的解决方案是错误的,那么为什么它是有效的… 人人享有的权利: 我尝试设置WillNotDrawBoolean标志flagtrue/false 在清单集中android:changeConfiguration=orientatio
@Override
public void onDraw(Canvas c) {
draw(c,lastHeading);
super.onDraw(c);
}
public synchronized void draw(Canvas c,int degrees) {
Paint p=new Paint();
p.setAntiAlias(true);
c.save();
rotateLayer(degrees,layer1, cLayers.getDrawable(0),false);
rotateLayer(lastSideAngle, layer2, sLayers.getDrawable(1),true);
rotateLayer(lastFrontAngle, layer2, fLayers.getDrawable(1),true);
c.drawBitmap(layer1,0, 0, p);
c.drawBitmap(layer2,0, 0, p);
c.drawBitmap(layer3, 0,0, p);
c.restore();
}
问题代码变体A和右侧:
@Override
public void run() {
Canvas c=null;
try
{
c=holder.lockCanvas(null);
synchronized (holder) {
postInvalidate();
}
finally
{
if(c!=null)
holder.unlockCanvasAndPost(c);
}
}
为什么它可以毫无问题地工作,但是相同的代码没有canvas的lock/unloc却不能正确工作?
在手机不改变方向之前,下一个应用程序可以正常工作。在更改方向时,重新绘制曲面需要很长时间,但在下一个方向更改时,更改速度很快。但在这两种变体中,我都调用PostnValidate,我不明白锁定/解锁画布对PostnValidate有何影响
@Override
public void run() {
postInvalidate();
}
在这个变体中,我在屏幕上看到一个永远不会出现的冻结图像:
@Override
public void run() {
Canvas c=null;
try
{
c=holder.lockCanvas(null);
synchronized (holder) {
draw(c,deg);
//OR
//onDraw(c)
}
finally
{
if(c!=null)
holder.unlockCanvasAndPost(c);
}
}
当应用程序绘制所有位图,但背景覆盖其所有位图时,还有一种变体。
那么我做错了什么,我需要做什么呢?这里:
@Override
public void run() {
Canvas c=null;
try
{
c=holder.lockCanvas(null);
synchronized (holder) {
draw(c,deg);
//OR
//onDraw(c)
}
finally
{
if(c!=null)
holder.unlockCanvasAndPost(c);
}
}
您需要设置一个循环,否则只调用一次onDraw方法。
这将创建一个连续的重画:
while(true) {
try
{
c=holder.lockCanvas(null);
synchronized (holder) {
draw(c,deg);
//OR
//onDraw(c)
}
finally
{
if(c!=null)
holder.unlockCanvasAndPost(c);
}
}