Frage

Ich bin neu in Android.

Ich zeichne Bitmaps, Linien und Formen auf eine Leinwand in der OnDraw (Canvas Leinwand) Methode meiner Ansicht. Ich bin auf der Suche nach Hilfe, wie in Reaktion auf einen Widerstand, der durch den Benutzer smooth scrolling zu implementieren. Ich habe gesucht, aber gefunden keine Tutorials zu helfen mir dabei.

Die Referenz für Leinwand scheint zu sagen, dass, wenn eine Leinwand aus einer Bitmap aufgebaut ist (so genannten bmpBuffer, sagt), dann alles auf dem Leinwand gezeichnet auch auf bmpBuffer gezogen wird. Wäre es möglich, bmpBuffer zu verwenden, um eine Rolle zu implementieren ... vielleicht kopieren Sie es zurück auf die Leinwand verschoben um einige Pixel zu einem Zeitpunkt? Aber wenn ich Canvas.drawBitmap verwenden bmpBuffer zurück auf Leinwand um einige Pixel verschoben zu zeichnen, wird nicht bmpBuffer beschädigt werden? Vielleicht deshalb sollte ich bmpBuffer zu bmpBuffer2 kopieren dann bmpBuffer2 zurück auf die Leinwand ziehen.

Ein einfacher Ansatz wäre es, die Linien, Formen zu zeichnen, usw. direkt in einen Puffer Bitmap zeichnet dann diesen Puffer (mit einer Verschiebung) auf die Leinwand, aber so weit ich die verschiedenen Methoden sehen: drawLine (), drawShape () und so weiter ist nicht verfügbar für zu einem Bitmap Zeichnung ... nur auf eine Leinwand.

Kann ich 2 Blachen? Einer davon aus dem Puffer Bitmap konstruiert werden würde und einfach zum Zeichnen der Linien, Formen, usw. und dann der Puffer Bitmap würde gezogen auf die anderen Leinwand für die Anzeige im View?

verwendet

soll ich einen Rat begrüßen zu können!

Die Antworten auf ähnliche Fragen hier (und auf anderen Websites) beziehen sich auf „Blitten“. Ich das Konzept verstehen, kann aber nichts über „Blit“ oder „BitBlt“ in der Android-Dokumentation. Sind Canvas.drawBitmap und Bitmap.Copy Androids Äquivalente?

War es hilfreich?

Lösung

Ich hatte dieses Problem auch,

Ich habe Zeichnung das wie folgt aus:

Canvas BigCanvas = new Canvas();
Bitmap BigBitmap = new Bitmap(width,height);

int ScrollPosX , ScrollPosY  // (calculate these with the onScrollEvent handler)

void onCreate()
{
   BigCanvas.SetBitmap(BigBitmap);
}

onDraw(Canvas TargetCanvas)
{
   // do drawing stuff
   // ie.  BigCanvas.Draw.... line/bitmap/anything

   //draw to the screen with the scrolloffset

   //drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint)
   TargetCanvas.DrawBitmap(BigBitmap(new Rect(ScrollPosX,ScrollPosY,ScrollPosX + BigBitmap.getWidth(),ScrollPosY + BigBitmap.getHeight(),new Rect(0,0,ScreenWidth,ScreenHeight),null);
}

glatt zum Scrollen Sie bräuchten eine Art von Verfahren zu machen, die ein paar Punkte nach dem Scrollen (dh die erste Spiralpunkt und den 10.) nimmt, subtrahieren diese und blättern durch diese Nummer in eine für jede Schleife, die sie nach und nach macht langsamer (ScrollAmount - Kurven - Reibung).

Ich hoffe, das gibt etwas mehr Einblick.

Andere Tipps

scheine ich eine Antwort gefunden zu haben. Ich habe den Großteil der Zeichencode setzen (die in OnDraw zuvor war ()) in einem neuen doDrawing () -Methode. Dieses Verfahren beginnt, indem eine neue Bitmap größer als der Bildschirm (groß genug, um die vollständige Zeichnung zu halten) zu schaffen. Es erstellt dann eine zweite Leinwand, auf die die detaillierte Zeichnung zu tun:

    BufferBitmap = Bitmap.createBitmap(1000, 1000, Bitmap.Config.ARGB_8888);
    Canvas BufferCanvas = new Canvas(BufferBitmap);

Der Rest des doDrawing () -Methode mit Detailzeichnung zu BufferCanvas aufgenommen.

Der gesamte OnDraw () -Methode lautet nun wie folgt:

    @Override protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawBitmap(BufferBitmap, (float) -posX, (float) -posY, null);
}

Die Positionsvariablen, posX und posY, werden bei 0 in der Anwendung des onCreate () -Methode initialisiert. Die Anwendung implementiert OnGestureListener und verwendet die distanceX und distanceY Argumente in der OnScroll Benachrichtigung zurück posX und posY zu erhöhen.

Das scheint über alles zu sein, die benötigt wird smooth scrolling zu implementieren. Oder bin ich mit Blick über etwas !?

Fortsetzung der Antwort auf Viktor ...

In der Tat ist die Situation komplizierter. Da der doDrawing Prozess sehr langsam ist (2-3 Sekunden auf meinem langsamen alten HTC Hero-Handy) Ich fand es wünschenswert, eine Toast Nachricht Pop-up des Benutzer darauf hinweist, dass es geschieht, und den Grund anzuzeigen. Der offensichtliche Weg, dies zu tun war eine neue Methode nur 2 Zeilen mit erstellen:

public void redrawBuffer(String strReason) {
    Toaster.Toast(strReason, "Short");`
    doDrawing();
}

und zum Aufruf diese Methode von anderen Orten in meinem Programm statt doDrawing ().

Allerdings fand ich, dass der Toaster entweder nie erschienen oder blitzte so kurz, dass sie nicht gelesen werden können. Meine Abhilfe wurde eine Zeitprüfung Handler zu verwenden, um das Programm zu schlafen für 200 Millisekunden zu zwingen, zwischen dem Toast Anzeigen und Aufrufen doDrawing (). Obwohl dieser leicht verzögert den Beginn eines neu zu zeichnen ich finde, dass das ein Preis wert ist in Bezug auf das Programm Usability zahlen, da der Benutzer weiß, was los ist. reDrawBuffer () lautet nun:

public void redrawBuffer(String strReason) {
    Toaster.Toast(strReason, "Short");
    mTimeCheckHandler.sleep(200);    
}`

und der Handler-Code (die innerhalb meiner Ansicht Klasse verschachtelt ist) ist:

private timeCheckHandler mTimeCheckHandler = new timeCheckHandler();

class timeCheckHandler extends Handler {
@Override
    public void handleMessage(Message msg) {
        doDrawing();
    }
    public void sleep(long delayMillis) {
        this.removeMessages(0);
        sendMessageDelayed(obtainMessage(0), delayMillis);
    }
}`

Keine Notwendigkeit für die Aktivität neu gestartet werden! (Per prepbgg-Spieler Jan 27 10 Antwort auf seine 17. Januar 10 ‚Antwort‘) Anstatt die Bitmap-Recycling und das Eingehen von dem Overhead mit der Aktivität neu geladen wird, können Sie vermeiden, die Anwendung, indem Sie das ‚android: configChanges‘ geladen mit Attribute unten gezeigt, in der ‚Tätigkeit‘ Element der AndroidManifest.xml Datei für die App. Dies teilt das System die die App Orientierungsänderungen handhaben wird, und dass es nicht um die Anwendung neu starten muss.

<activity android:name=".ANote"
    android:label="@string/app_name"
    android:configChanges="orientation|screenLayout">
    <intent-filter>
       <action android:name="android.intent.action.MAIN" />
       <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Diese Methode kann verwendet werden, um eine Benachrichtigung zu erhalten, wenn die orienation geändert wird:

public void onConfigurationChanged(Configuration  newConfig) {
    super.onConfigurationChanged(newConfig);
    prt("onConfigurationChanged: "+newConfig);

    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
      prt("  PORTRAIT");
    } else {
      prt("  LANDSCAPE");
    }
} // end of onConfigurationChanged

prepbgg. Ich glaube nicht, wird der Code arbeiten, weil canvas.drawBitmap nicht in das Bitmap ziehen, sondern zieht die Bitmap auf die Leinwand

Korrigieren Sie mich, wenn ich falsch bin!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top