2012-01-11 65 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/

相關問題