2012-01-11 37 views
0

在SurfaceView上向下滚动屏幕位图向下一行不起作用。在SurfaceView上向下滚动屏幕位图,向下一行不起作用

请尝试下面的示例代码来证明Android Java图形位图系统中某些东西似乎已损坏,或者(更可能)有一些关于此操作的信息,我不明白,当滚动屏幕外位图并在屏幕上绘制SurfaceView画布时使用drawBitmap。

运行代码一次,看看它是如何涂抹笔画的,只有在圆形填充的时候才会在页面上向下循环。

然后将Y偏移量从1更改为-1并重新运行代码,并向上滚动一行(很难看,因为它不是动画)。

package com.example.SurfaceViewTest; 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.Rect; 
import android.graphics.Paint.Style; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class SurfaceViewTest extends Activity implements SurfaceHolder.Callback { 

private SurfaceView mSurfaceView; 
private SurfaceHolder mSurfaceHolder; 
private int intSurfaceWidth, intSurfaceHeight; 

Bitmap bmpOffScreen; 
Canvas cnvOffScreen = new Canvas(); 
Canvas c = new Canvas(); 

private static Paint paint = new Paint(); 

private static final String TAG = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main); 

    mSurfaceView = (SurfaceView) this.findViewById(R.id.Surface); 
    mSurfaceHolder = mSurfaceView.getHolder(); 
    mSurfaceHolder.addCallback(this); 

    paint.setColor(0xFFFFFFFF); 
    paint.setStyle(Style.STROKE); 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    intSurfaceWidth = width; 
    intSurfaceHeight = height; 

    bmpOffScreen = Bitmap.createBitmap(intSurfaceWidth, intSurfaceHeight, Bitmap.Config.ARGB_8888); 
    cnvOffScreen = new Canvas(bmpOffScreen); 

    cnvOffScreen.drawCircle(intSurfaceWidth/2, intSurfaceHeight/2, 100, paint); 

    c = null; 
    c = mSurfaceHolder.lockCanvas(null); 

    if (c == null) { 
     Log.e(TAG, "Canvas bu-huu"); 
    } else { 
     // Scroll off screen canvas and hopefully underlying bitmap bitmap 
     Rect src = new Rect(0, 0, intSurfaceWidth, intSurfaceHeight); 
     Rect dst = new Rect(0, 0, intSurfaceWidth, intSurfaceHeight); 
     dst.offset(0, 1); 
     cnvOffScreen.drawBitmap(bmpOffScreen, src, dst, null); 

     // This produces exact same smear, but works fine scrolling up!?! 
     cnvOffScreen.translate(0,1); 
     cnvOffScreen.drawBitmap(bmpOffScreen, 0, 0, paint); 

     c.drawBitmap(bmpOffScreen, 0, 0, paint); 

     mSurfaceHolder.unlockCanvasAndPost(c); 
    } 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) {} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) {} 
} 
+0

增添了这里的解决方案:http://gamedev.stackexchange.com/questions/22070/how-to-update-off-screen-bitmap-in-a -surfaceview-thread – 2012-01-13 22:52:39

回答

2

有画布内的drawBitmap功能具有以下特征:

public void drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint); 

你可以让你的DST画布的大小,和你的src可以设置为新

Rect(0,offset,width,height+offset) 

然后,您可以增加每帧的偏移量,并在视图中获得平滑的滚动位图。

+0

我在我的代码中做了什么,它只能向上滚动 – DKDiveDude 2012-01-13 14:59:05

+0

其实已经尝试了您的确切建议,相同的问题 – DKDiveDude 2012-01-13 15:39:14

0

我有这个问题,并找出为什么发生这种情况。这是由于Android的翻译功能有点疏忽造成的。基本上,这是因为该功能只能通过从上到下复制每行从左到右的像素,而不检查您正在翻译的方向。因此,向左和向下移动它可以工作,因为它将现有像素复制到“旧”像素,但反过来,您正在将像素复制到以后要复制的像素上。

解决此问题的技巧是在右/下翻译中使用更快的翻译功能,但对其他方向使用较慢的位图复制方式。或者可能找到一种方法来重写翻译功能,但是我没有想到如何做到这一点。

我有一个小的书面记录在这里: http://spiralcode.wordpress.com/2013/06/17/long-time-no-see-of-rivers-cartography-and-tiling/

相关问题