在SurfaceView上向下滚动屏幕位图不能正常工作

时间:2012-01-11 15:28:07

标签: java android bitmap scroll 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) {}
}

2 个答案:

答案 0 :(得分:2)

画布中有一个带有以下签名的drawBitmap函数:

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

你可以使你的dst达到画布的大小,你的src可以设置为新的

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

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

答案 1 :(得分:0)

我有这个问题并弄清楚为什么会这样。这是因为android的翻译功能有点疏忽。基本上这是因为该功能仅通过从上到下每行从左到右复制像素来工作,而无需检查您要转换到哪个方向。所以左右移动,它的工作原理是因为它将现有像素复制到“旧”像素,但反过来说,您将像素复制到以后要复制的像素。

解决这个问题的技巧是在右/下翻译中使用更快的翻译功能,但对其他方向使用较慢的位图复制方式。或者也许找到一些方法来覆盖翻译功能,并使用正确的方法,但我还没想出怎么做。

我在这里写了一篇文章: http://spiralcode.wordpress.com/2013/06/17/long-time-no-see-of-rivers-cartography-and-tiling/