Come applicare nuovamente un'image a 9 patch a un ImageView?

Ho un'attività che ha un ImageView definito all'interno di un HorizontalScrollView. L'origine dell'image è un file a 9 patch che è vincolato a trattare solo il bordo destro per riempire lo schermo. Ho implementato una semplice function di zoom che consente all'utente di duplice toccare per ingrandire e ridurre la dimensione, ridimensionando la bitmap e assegnando la nuova bitmap alla vista. Il mio problema attuale è che quando duplico toccando per ridurre lo zoom, 9-patch non viene applicato quando assegnerò la nuova bitmap ridimensionata alla vista. In altre parole, invece di allungare solo il bordo destro come definito nel file a 9 patch, ha allungato l'intera image.

Ecco il mio XML:

  • Apri url con un browser
  • Creare la forma di riempimento onDraw con canvas.drawLine
  • Come utilizzare i dati del sensore suSensorChanged in combinazione con OpenGL
  • Come controlli se la musica sta giocando utilizzando un ricevitore broadcast?
  • Salvataggio dei dati in edittext quando si colpisce il button Indietro
  • Pulsanti in Codename Una forma intriggers sul dispositivo effettivo di Android, ma funziona sotto il simulatore
  • <HorizontalScrollView android:id="@+id/hScroll" android:fillViewport="true" android:layout_width="fill_parent" android:layout_height="fill_parent" android:fadingEdge="none" > <RelativeLayout android:id="@+id/rlayoutScrollMap" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:id="@+id/imgResultMap" android:layout_width="fill_parent" android:layout_height="fill_parent" android:scaleType="fitXY" android:src="@drawable/map_base"/> </RelativeLayout> </horizontalScrollView> 

    Ecco la parte appropriata del mio codice, all'interno della chiamata onDoubleTap ():

     public boolean onDoubleTap(MotionEvent e) { if (zoom == 1) { zoom = 2; // zoom out } else { zoom = 1; // zoom in } Bitmap image = BitmapFactory.decodeResource(getResources(),R.drawable.map_base); Bitmap bmp = Bitmap.createScaledBitmap(image, image.getWidth() * zoom, image.getHeight() * zoom, false); ImageView imgResultMap = (ImageView)findViewById(R.id.imgResultMap); imgResultMap.setImageBitmap(bmp); return false; } 

    EDIT : Dopo aver fatto qualche ricerca, l'ho capito. Invece di manipolare semplicemente la bitmap, devo includere anche il pezzo da 9 patch, che non fa parte dell'image bitmap, per ribuild un nuovo disegni a 9 patch. Vedere il codice di esempio riportto di seguito:

      ... else { // Zoom out zoom = 1; Bitmap mapBitmapScaled = mapBitmap; // Load the 9-patch data chunk and apply to the view byte[] chunk = mapBitmap.getNinePatchChunk(); NinePatchDrawable mapNinePatch = new NinePatchDrawable(getResources(), mapBitmapScaled, chunk, new Rect(), null); imgResultMap.setImageDrawable(mapNinePatch); } .... 

  • Differenza tra navigatore di navigazione Doc Android e navigationDrawerActivity
  • Il collegamento dovrebbe essere aperto nella stessa visualizzazione web in Android
  • Android DataBinding where trovare context?
  • Come fare il layout con angoli arrotondati ..?
  • Disegno di AppCompat Actionbar
  • listview visualizza i dati dal database in android
  • 5 Solutions collect form web for “Come applicare nuovamente un'image a 9 patch a un ImageView?”

    EDIT : Dopo aver fatto qualche ricerca, l'ho capito. Invece di manipolare semplicemente la bitmap, devo includere anche il pezzo da 9 patch, che non fa parte dell'image bitmap, per ribuild un nuovo disegni a 9 patch. Vedere il codice di esempio riportto di seguito:

      ... else { // Zoom out zoom = 1; Bitmap mapBitmapScaled = mapBitmap; // Load the 9-patch data chunk and apply to the view byte[] chunk = mapBitmap.getNinePatchChunk(); NinePatchDrawable mapNinePatch = new NinePatchDrawable(getResources(), mapBitmapScaled, chunk, new Rect(), null); imgResultMap.setImageDrawable(mapNinePatch); } .... 

    EDIT # 2 : Per coloro che guardano la mia soluzione qui, anche dare un'occhiata a Kai suggerimenti di seguito per quanto riguarda la gestione della memory. Informazioni molto utili.

    Perché non includere due immagini scalate diverse e passare da un altro all'altro utilizzando imgResultMap.setImageResource(resId) quando si ingrandisce? Si noti inoltre che si sta caricando e creando Bitmaps in UIThread che non è un buon modo per fornire un'esperienza utente agevole, alless preload il bitmap solo una volta durante onCreate () e cache che.

    Spostare questo: ImageView imgResultMap = (ImageView)findViewById(R.id.imgResultMap); ad un globale intialized nel metodo onCreate. Altrimenti il ​​dispositivo deve cercare la visualizzazione e trovarlo each volta che viene selezionato.

    e prova a call imgResultMap.invalidate(); prima di tornare dal metodo onDoubleTap ( http://developer.android.com/reference/android/view/View.html#invalidate () )

    Le immagini a 9 patch sembrano funzionare solo quando sono impostate come un'image di background di View . Così:

    • invece di android:src , impostare android:background nel tuo layout XML, e
    • call setBackgroundResource() quando si desidera modificare l'image.

    È inoltre ansible utilizzare una View normale, invece di un ImageView se si desidera; non import molto.

    Un'altra soluzione è impostare l'image in modo programmato come ImageResource e impostare scaleType

     imageView.setImageResource(R.drawable.favorite_driver_icon); imageView.setScaleType(ScaleType.FIT_XY); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.