2012-01-11 4 views
0

SurfaceViewの画面ビットマップを1行下にスクロールしても機能しません。SurfaceViewの画面ビットマップを1行下にスクロールしても動作しない

AndroidのJavaグラフィックスビットマップシステムで何かが壊れていると思われる場合は、以下のサンプルコードを試してみてください。または、これについてわかっていないものがあります。オフスクリーンのビットマップをスクロールして画面上のSurfaceViewキャンバスdrawBitmapを使用します。

コードを一度実行して、円のようにページの下を丸く塗りつぶす方法を参照してください。

次に、Yオフセットを1から-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 –

答えて

2

次のシグネチャを持つキャンバス内drawBitmap機能があります:

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

あなたのDSTキャンバスのサイズを作ることができ、そして、あなたのSRCは、新しいことするように設定することができます

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

フレームごとにオフセットを増やして、スムーズにスクロールするビットマップを表示できます。

+0

私は自分のコードで何をしたのですか?スクロールするだけです – DKDiveDude

+0

実際にあなたの正確な提案、同じ問題を試しました – DKDiveDude

0

私はこの問題を抱え、これがなぜ起こったのかを考えました。これは、アンドロイドの翻訳機能の怠慢のためです。基本的には、変換する方向を確認せずに、行ごとにピクセルを上から下にコピーするだけで機能するためです。つまり、左下に移動すると、既存のピクセルを「古い」ピクセルにコピーしていますが、逆の場合は、後でコピーするピクセルにピクセルをコピーしているためです。

これを解決するには、右/下の翻訳では高速の翻訳機能を使用しますが、他の方向では遅いビットマップのコピー方法を使用するのが賢明です。または、翻訳機能を正しく機能させる方法で翻訳機能を無効にする方法があるかもしれませんが、その方法はまだわかりません。

私はここで少し過去記事を持っている: http://spiralcode.wordpress.com/2013/06/17/long-time-no-see-of-rivers-cartography-and-tiling/

関連する問題