2012-06-14 5 views
1

Dans mon application, j'ai un adaptateur de liste. chaque ligne comprend un imageView dans la gauche et deux textViews dans la droite. Pour obtenir des images, j'utilise la bibliothèque Universal-Image-Loader.Android, Comment ajouter un calque bitmap sur un autre calque bitmap, dynamiquement à partir d'une liste?

ma méthode getView() est la suivante:

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder;   

     if (convertView == null) { 
      convertView  = myInflater.inflate(R.layout.list_news_adapter, null); 
      holder   = new ViewHolder(); 
      holder.ivIcon = (ImageView) convertView.findViewById(R.id.list_news_icon); 
      holder.tvTitle = (TextView) convertView.findViewById(R.id.list_news_title); 
      holder.tvDate = (TextView) convertView.findViewById(R.id.list_news_date); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 


     holder.tvTitle.setText(video.getTitle().get(position)); 
     holder.tvDate.setText(localTime.get(position)); 

     // Load and display image 
     String imageUrl = (video.getDefaultImage128x96().get(position)); 
     imageUrl = imageUrl.trim().replaceAll(" ", "%20"); 
     imageLoader.displayImage(imageUrl, holder.ivIcon, options); 



     holder.ivIcon.buildDrawingCache(); 
     Bitmap image = holder.ivIcon.getDrawingCache(); 
     if(image != null) { 
      image = putOverlay(image, holder.ivIcon.getWidth(), holder.ivIcon.getHeight()); 
      holder.ivIcon.setImageBitmap(image); 
      holder.ivIcon.destroyDrawingCache(); 
     } 


     return convertView; 
    } 

dans le code ci-dessous, je donne la liste des URL à cette libray à télécharger dans différents threads.

// Load and display image 
String imageUrl = (video.getDefaultImage128x96().get(position)); 
imageUrl = imageUrl.trim().replaceAll(" ", "%20"); 
imageLoader.displayImage(imageUrl, holder.ivIcon, options); 

après dans le code suivant, je suis obtenir l'image actuelle de imageView (qui est téléchargé) et demander une autre méthode pour ajouter une couche au-dessus de cette image.

holder.ivIcon.buildDrawingCache(); 
Bitmap image = holder.ivIcon.getDrawingCache(); 

if(image != null) { 
     image = putOverlay(image, holder.ivIcon.getWidth(), holder.ivIcon.getHeight()); 
     holder.ivIcon.setImageBitmap(image); 
     holder.ivIcon.destroyDrawingCache(); 
} 

méthode putOverlay() est comme ceci:

public Bitmap putOverlay(Bitmap bmp, int width, int height) { 
     Bitmap overLay = BitmapFactory.decodeResource(context.getResources(), R.drawable.video_overlay); 

     Bitmap bmBackground = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig()); 
     Canvas canvas = new Canvas(bmBackground); 
     Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG); 
     canvas.drawBitmap(bmp, 0, 0, paint); 
     canvas.drawBitmap(overLay, width*3/8, height*3/8, paint); 

     return bmBackground; 
    } 

Il faisait partie fonctionnelle. Qu'en est-il du résultat! La bibliothèque Universal Image Loader utilise une image prédéfinie tant que l'image principale est en cours de téléchargement. mon code peut fusionner ces deux couches. Cependant, lorsque l'image principale est téléchargée, elle remplace l'image précédente alors que je m'attends à ce que l'image de superposition se trouve au-dessus de cette image. Mais, après défilement de l'écran, je peux voir mon image ajoutée (la plupart des images ont et certains d'entre eux n'ont pas mon image ajoutée). enter image description here

toute suggestion/commentaire serait appréciée.

Répondre

2

La solution était plus simple que ce à quoi je pensais.

D'abord, je retire les

holder.ivIcon.buildDrawingCache(); 
Bitmap image = holder.ivIcon.getDrawingCache(); 
if(image != null) { 
    image = putOverlay(image, holder.ivIcon.getWidth(), holder.ivIcon.getHeight()); 
    holder.ivIcon.setImageBitmap(image); 
    holder.ivIcon.destroyDrawingCache(); 
} 

et putOverlay() méthode de mon adaptateur liste, puis dans le fichier XML de la ligne (list_news_adapter), j'ai ajouté une autre imageView et définissez son attribut source avec mon image.

Wow, ça marche bien.

Questions connexes