Прокрутка за пределами экрана, на SurfaceView, вниз на одну строку не работает - PullRequest
0 голосов
/ 11 января 2012

Прокрутка за пределами экрана, на SurfaceView, вниз на одну строку не работает.

Попробуйте приведенный ниже пример кода, чтобы доказать, что что-то кажется неисправным в системе растровых изображений Java Java Android, или (что более вероятно) в этом есть что-то, чего я не понимаю, при прокрутке растрового изображения за пределами экрана и рисовании на экране SurfaceView canvas с помощью 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 ]

2 голосов
/ 13 января 2012

В холсте есть функция drawBitmap со следующей подписью:

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

Вы можете сделать dst размером холста, и ваш src может быть настроен как новый

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

Затем вы можете увеличивать смещение для каждого кадра и получать плавно прокручиваемое растровое изображение в своем представлении.

0 голосов
/ 12 ноября 2013

У меня была эта проблема, и я понял, почему это произошло. Это связано с небрежностью в функции перевода Android. В основном это потому, что функция работает ТОЛЬКО путем копирования пикселей слева направо на строку сверху вниз, без проверки направления, в которое вы переводите. Таким образом, двигаясь влево и вниз, он работает, потому что копирует существующие пиксели в «старые» пиксели, но наоборот, вы копируете пиксели в пиксели, которые хотите скопировать позже.

Хитрость в решении этой проблемы заключается в использовании более быстрой функции перевода при переводе вправо / вниз, но при использовании медленного способа копирования растрового изображения для других направлений. Или, может быть, найти способ переопределить функцию перевода с помощью функции, которая делает это правильно, но я пока не выяснил, как это сделать.

У меня есть небольшая статья здесь: http://spiralcode.wordpress.com/2013/06/17/long-time-no-see-of-rivers-cartography-and-tiling/

...