Domanda

Sono nuovo di Android.

sto disegnando bitmap, linee e forme su una tela all'interno del metodo OnDraw (Tela) del mio punto di vista. Sto cercando aiuto su come implementare scorrimento uniforme in risposta ad una resistenza da parte dell'utente. Ho cercato ma non trovato alcun tutorial per aiutare me con questo.

La domanda di Canvas sembra dire che se una tela di canapa è costruita da un bitmap (chiamato bmpBuffer, dicono) allora tutto disegnato sulla tela è anche disegnato su bmpBuffer. Sarebbe possibile utilizzare bmpBuffer per implementare un rotolo ... forse copiarlo di nuovo alla tela spostata di alcuni pixel alla volta? Ma se io uso Canvas.drawBitmap disegnare bmpBuffer di nuovo a tela di canapa spostata di alcuni pixel, non sarà bmpBuffer essere danneggiato? Forse, quindi, dovrei copiare bmpBuffer a bmpBuffer2 quindi disegnare bmpBuffer2 torna alla tela.

Un approccio più diretto sarebbe quello di disegnare le linee, forme, ecc direttamente in una bitmap tampone poi pesca tampone (con uno spostamento) sulla tela ma quanto posso vedere i vari metodi: DrawLine (), drawShape () e così via non sono disponibili per il disegno di una bitmap ... solo per una tela di canapa.

Potrei avere 2 tele? Uno dei quali sarebbero costruite dalla bitmap buffer e utilizzato semplicemente per tracciare le linee, forme, ecc e poi il bitmap tampone sarebbe stato redatto sull'altro Canvas per la visualizzazione nella View?

dovrei accogliere qualsiasi consiglio!

Le risposte alle domande simili qui (e su altri siti web) si riferiscono a "copiarlo sul video". Capisco il concetto, ma non riesco a trovare niente di "blit" o "bitblt" nella documentazione di Android. Sono equivalenti di Canvas.drawBitmap e Bitmap.Copy Android?

È stato utile?

Soluzione

Ho avuto anche questo problema,

Ho fatto il disegno in questo modo:

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);
}

per regolare lo scorrimento avresti bisogno di fare una sorta di metodo che prende un paio di punti dopo lo scorrimento (cioè il primo punto di scorrimento e il 10), sottrarre quelli e scorrere da quel numero in uno per ogni ciclo che lo rende poco a poco più lento (ScrollAmount - gira - attrito).

Spero che questo dà un po 'di comprensione.

Altri suggerimenti

Mi sembra di aver trovato una risposta. Ho messo la maggior parte del codice di disegno (che in precedenza era in OnDraw ()) in un metodo nuovo doDrawing (). Questo metodo inizia con la creazione di una nuova bitmap più grande dello schermo (abbastanza grande da contenere il disegno completo). Si crea quindi una seconda tela su cui fare il disegno dettagliato:

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

Il resto del metodo doDrawing () viene ripreso con disegno dettagliato di BufferCanvas.

L'intero metodo OnDraw () ora recita come segue:

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

Le variabili di posizione, posX e posY, vengono inizializzati a 0 nel metodo onCreate () dell'applicazione. L'applicazione implementa OnGestureListener e usa gli argomenti distanceX e distanceY restituiti nella notifica OnScroll per incrementare posX e posY.

Questa sembra essere su tutto ciò che serve per implementare lo scorrimento uniforme. O sono affacciato qualcosa !?

Continuazione della risposta a Viktor ...

In realtà, la situazione è più complicata. Poiché il processo di doDrawing è piuttosto lento (prendendo 2-3 secondi sul mio lento vecchio telefono HTC Hero) ho trovato auspicabile pop-up un messaggio Toast per avvisare l'utente che stava accadendo e per indicare il motivo. Il modo più ovvio per farlo era quello di creare un nuovo metodo che contiene solo 2 linee:

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

e chiamare questo metodo da altri luoghi nel mio programma, invece di doDrawing ().

Tuttavia, ho trovato che il tostapane sia mai apparso o balenò in modo breve tempo che non poteva essere letta. La mia soluzione è stata quella di utilizzare un controllo Handler tempo per forzare il programma a dormire per 200 millisecondi tra la visualizzazione del Toast e chiamando doDrawing (). Anche se questo ritarda un po 'l'inizio di un ridisegno sento che questo è un prezzo da pagare in termini di usabilità del programma perché l'utente sa che cosa sta succedendo. reDrawBuffer () ora recita:

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

e il codice del gestore (che è nidificato all'interno della mia classe View) è:

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);
    }
}`

Non è necessario per l'attività di essere riavviato! (Per di prepbgg 27 Gennaio 10 risposta alla sua 17 Gennaio 10 'risposta') Invece di riciclare il bitmap e incorrere l'overhead di avere l'attività ricaricato, si può evitare di avere l'applicazione caricata mettendo il 'Android: configChanges' attributo illustrato di seguito, nell'elemento 'attivita' del file AndroidManifest.xml per l'applicazione. Questo dice al sistema l'applicazione gestirà le modifiche di orientamento e che non ha bisogno di riavviare l'applicazione.

<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>

Questo metodo può essere utilizzato per ricevere una notifica quando l'orienation è cambiato:

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:. Non credo che il codice funzionerà perché canvas.drawBitmap non trae in bitmap, ma disegna il bitmap-to tela

Correggetemi se sbaglio!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top