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

标签 java android bitmap scroll surfaceview

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

尝试下面的示例代码来证明 Android Java 图形位图系统中的某些内容似乎已损坏,或者(更有可能)当向下滚动屏幕外位图并使用屏幕 SurfaceView Canvas 上进行绘制时,有一些我不明白的内容绘制位图。

运行一次代码,看看它如何将笔画涂抹在页面上,就像圆圈被填充一样。

然后将 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) {}
}

最佳答案

Canvas 中有一个drawBitmap函数,其签名如下:

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

你可以将你的 dst 设置为 Canvas 的大小,并且你的 src 可以设置为新的

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

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

关于java - 滚动屏幕位图,在 SurfaceView 上向下一行不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8821880/

相关文章:

Android Google Play 订阅无法自动续订

android - 将带有名称值对的数组列表从一个 Activity 传递到另一个 Activity ?

java - 将 SQLite 数据库以 mdb 或 accdb 数据库格式从 Android 手机导出到我的系统

C、读取 .bmp 时遇到问题

java - SapJco 3.0.11 与 Maven : It is not allowed to rename or repackage the original archive "sapjco3.jar"

java - 使用编译器 API 的程序中的内存泄漏

android - SurfaceView 到位图

android - 无法从共享首选项中保存的 URI 加载图像

java - 如何知道 JTextField 是否为空?

Java——必须返回 boolean 类型(但我返回 true 或 false)