Spanish Problemas cargar imagenes con xCustomListView [SOLUCIONADO]

Carlos marin

Active Member
Licensed User
Longtime User
Hola amigos;

tengo el siguiente problema al tratar de adaptar esta vista tomada de este hilo: https://www.b4x.com/android/forum/t...listview-cross-platform-customlistview.84501/

lo que mas me llamo la atención es poder re-dimensionar las imágenes para que se acomoden felizmente al image donde las cargo. el problema es que para utilizar esta clase pide que la imagen este guardada en el dispositivo, pero yo lo que hago es cargarlas desde la web.

codigo para redimencionar imagenes:
B4X:
Img1.SetBitmap(xui.LoadBitmapResize(File.DirAssets, Image, Img1.Width, Img1.Height, True))

las imágenes las cargo con un servicio ImageDownloader
B4X:
Sub Download (ImageViewsMap As Map)
    For i = 0 To ImageViewsMap.Size - 1
        tasks.Put(ImageViewsMap.GetKeyAt(i), ImageViewsMap.GetValueAt(i))
        Dim link As String = ImageViewsMap.GetValueAt(i)
        If cache.ContainsKey(link) Then
            Dim iv As ImageView = ImageViewsMap.GetKeyAt(i)
            iv.SetBackgroundImage(cache.Get(link))
    
        Else If ongoingTasks.ContainsKey(link) = False Then
            ongoingTasks.Put(link, "")
            Dim j As HttpJob
            j.Initialize(link, Me)
            j.Download(link)
        End If
    Next
End Sub

Sub JobDone(Job As HttpJob)
    ongoingTasks.Remove(Job.JobName)
    If Job.Success Then
        Dim bmp As Bitmap = Job.GetBitmap
        cache.Put(Job.JobName, bmp)
        If tasks.IsInitialized Then
            For i = 0 To tasks.Size - 1
                Dim link As String = tasks.GetValueAt(i)
                If link = Job.JobName Then
                    'guardo temporal
                    Dim iv As B4XView = tasks.GetKeyAt(i)
                    Dim B As Bitmap = bmp
                    Dim o As OutputStream
                    o=File.OpenOutput(File.DirDefaultExternal,"/cache/temp.jpg",False)
                    B.WriteToStream(o,100,"JPEG")
                    o.Close
                    'cargo imagen guardada
                    iv.SetBitmap(xui.LoadBitmapResize(File.DirDefaultExternal,"/cache/temp.jpg", iv.Width, iv.Height, True))
                    'Sleep(1)
                End If
            Next
        End If
    Else
    End If
    Job.Release
End Sub

alguna ayuda? alguien ya le paso esto?
las imagenes que adjunto el LadoA es el redimencionado el B no
 

Attachments

  • logo1A.jpeg
    logo1A.jpeg
    93.1 KB · Views: 351
  • logo1B.jpeg
    logo1B.jpeg
    101.8 KB · Views: 320
  • logo2A.jpeg
    logo2A.jpeg
    77.1 KB · Views: 344
  • logo2B.jpeg
    logo2B.jpeg
    82.1 KB · Views: 306

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Carlos:

Puedes cargar la imagenes con LoadBitmapSample , de esa forma cargas menos la memoria y de paso la dimensionas a lo que quieras.

Saludos
 

Carlos marin

Active Member
Licensed User
Longtime User
Hola Carlos:

Puedes cargar la imagenes con LoadBitmapSample , de esa forma cargas menos la memoria y de paso la dimensionas a lo que quieras.

Saludos

Hola bgsoft ya he utilizado LoadBitmapSample y tengo 2 problemas,

1 aunque me reduce el peso para cargarlas mas rápido no veo que me juste el ancho y alto de la imagen fíjate en la foto de tv-sony laboB, esta expandida en toda la imagen mientras que la del ladoA hace un resise excelente
2. LoadBitmapSample me pide que el archivo este guardado en el dispositivo, yo lo que hago es cargarlas desde un servidor

bueno en si ese es mi problema yo cargo las fotos desde un servidor y quisiera justaarlas perffectamente a mi Image, pues que no queden como un fill todas expandidas, sera posible?
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Carlos:

Como tu cargas la imagen directamente en un bitmap, para dimensionarla puedes emplear el .Width y el .Height para saber la relación de aspecto, y luego darles el ancho y alto que te interese.

Algo asi:

B4X:
    Ancho = valor máximo que quieras darle en ancho

  Xi = Bitmap1.Width ' el nombre del bitmap donde cargues la imagen
  Yi = Bitmap1.Height ' el nombre del bitmap donde cargues la imagen
  XdivY = Xi / Yi   ' XdivY tiene que ser un Double
  Xf = Ancho
  Yf = Xf / XdivY
  ' Luego asignas el ancho (Xf) y el alto (Yf) a la imagen



Saludos
 

Carlos marin

Active Member
Licensed User
Longtime User
Hola Carlos:

Como tu cargas la imagen directamente en un bitmap, para dimensionarla puedes emplear el .Width y el .Height para saber la relación de aspecto, y luego darles el ancho y alto que te interese.

Algo asi:

B4X:
    Ancho = valor máximo que quieras darle en ancho

  Xi = Bitmap1.Width ' el nombre del bitmap donde cargues la imagen
  Yi = Bitmap1.Height ' el nombre del bitmap donde cargues la imagen
  XdivY = Xi / Yi   ' XdivY tiene que ser un Double
  Xf = Ancho
  Yf = Xf / XdivY
  ' Luego asignas el ancho (Xf) y el alto (Yf) a la imagen



Saludos


Hola bgsoft no e probado esto que dices tampoco e visto ejemplos lo intentare y ps te comento, muchas gracias.
por cierto no se si has visto este servicio para descargar las imágenes, este guarda las imágenes en una cache para al momento de volver a cargar la imagen no tener que descargarla, como obtengo el bitmap de ahi para volver a redimencionarlo??

B4X:
Sub Download (ImageViewsMap As Map)
    For i = 0 To ImageViewsMap.Size - 1
        tasks.Put(ImageViewsMap.GetKeyAt(i), ImageViewsMap.GetValueAt(i))
        Dim link As String = ImageViewsMap.GetValueAt(i)
        If cache.ContainsKey(link) Then 'aqui pregunta si l imagen esta en la cacke y simplemente la carga, no la descarga
            Dim iv As ImageView = ImageViewsMap.GetKeyAt(i)
            iv.SetBackgroundImage(cache.Get(link))
    
        Else If ongoingTasks.ContainsKey(link) = False Then
            ongoingTasks.Put(link, "")
            Dim j As HttpJob
            j.Initialize(link, Me)
            j.Download(link)
        End If
    Next
End Sub
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Carlos:

Prueba a dimensionar una vez cargada la imagen Dim iv As ImageView , al cargar esa imagen te dará un ancho y un alto (teoricamente) si no, pasala a un bitmap, coges la relación de aspecto , redimensionas y luego descargas ese bitmap.

Saludos
 
Top