Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SurfaceView、onDraw和postInvalidate()有什么问题吗_Java_Android_Surfaceview_Ondraw - Fatal编程技术网

Java SurfaceView、onDraw和postInvalidate()有什么问题吗

Java SurfaceView、onDraw和postInvalidate()有什么问题吗,java,android,surfaceview,ondraw,Java,Android,Surfaceview,Ondraw,这个应用程序表现得很奇怪。我有一个类扩展了SurfaceView并实现了SurfaceHolder.Callback。 我尝试了3种代码选项,其中只有一种能满足我的需要,但我怀疑这是一种正确的解决方案,而另一种则有不同的行为。所以,我的问题是为什么和什么是错误的,如果正确的解决方案是错误的,那么为什么它是有效的… 人人享有的权利: 我尝试设置WillNotDrawBoolean标志flagtrue/false 在清单集中android:changeConfiguration=orientatio

这个应用程序表现得很奇怪。我有一个类扩展了SurfaceView并实现了SurfaceHolder.Callback。 我尝试了3种代码选项,其中只有一种能满足我的需要,但我怀疑这是一种正确的解决方案,而另一种则有不同的行为。所以,我的问题是为什么和什么是错误的,如果正确的解决方案是错误的,那么为什么它是有效的… 人人享有的权利:

我尝试设置WillNotDrawBoolean标志flagtrue/false 在清单集中android:changeConfiguration=orientation 在主布局中,使用通过xml资源定义的平铺图片设置背景。 现在,正确的实施方法是: 我有线程调用postInvalidate;lockCanvas和unlockCanvas之间存在延迟和调用: 我的onDraw和drawCanvas c,int deg在所有变化中均相同:

@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);
   } 
}