Meilleure façon d'afficher l'image dans l'affichage de la grille est de défilement lisse
Tout d'abord, j'ai déjà fait quelques choses pour afficher l'image en gridview faire en douceur lors du défilement
1. charger une image à partir d'internet sur le thread d'arrière-plan
AsyncTask acyncTask ;
HandlerThread handlerThread ;
URL imageUrl = new URL(link);<br>
HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is=conn.getInputStream();
final Bitmap bitmap = BitmapFactory.decodeStream(is);
2. faire bitmap à la taille de l'échantillon pour économiser de la mémoire
final BitmapFactory.Options option = new BitmapFactory.Options();
option.inJustDecodeBounds = true;
BitmapFactory.decodeFile(mFile.getPath(),
option);
option.inSampleSize = calculateInSampleSize(option , mSize , mSize);
option.inJustDecodeBounds = false;
option.inPurgeable = true ;
option.inDither = false ;
option.inScaled = false ;
option.inPreferredConfig = Bitmap.Config.ARGB_8888;
3. faire un cache pour enregistrer décodé bitmap
LruCache lruCache = new LruCache<String , Bitmap>();
dans baseadapter getView();
Je vais lruCache.get(key)
de prendre la décodé bitmap
4. lazy load lorsque bitmap décodé par gestionnaire
Handler handler = new Handler();
handler.post(new Runnable(){
public void run(){
imageView.setimageBitmap(bitmap);
}
});
Maintenant, je suis confronté à un gros problème, il accusent encore un peu quand je suis défilement
j'ai google à propos de quelque chose peut faire la défilement mieux, je ne sais pas vraiment quelque chose à améliorer ou le problème est de sortir de l'endroit où je l'ai vérifier pour chaque getView() ne passent que moi sur 2~6ms et il va appeler mon code pour chargement asynchrone la forme d'une image thread de travail, donc je ne sais pas vraiment pourquoi certaines applications peuvent chargement très lisse? mon cas est lors du défilement l'écran ne sera pas ressembler à très lisse, c'est une suggestion peut-elle s'appliquer?
édité : quand je suis défilement , le bitmap trouvé dans le cache et l'affichage sur l'écran , si je défilement rapide , il ressemblera à aucun défilement suffit à montrer l'image , il ne me faites défiler jusqu'pas si lisse , même moi j'ai du cache vers le bas de l'image bitmap dans le cache
voici le code d'adaptateur :
if (convertView == null) {
convertView = layoutInflater.inflate(
R.layout.row_display_image_grid, null);
viewHolder = new DisplayImageGridViewHolder();
viewHolder.background = (RelativeLayout) convertView
.findViewById(R.id.background);
viewHolder.image = (ImageView) convertView.findViewById(R.id.image);
viewHolder.text = (TextView) convertView.findViewById(R.id.text);
viewHolder.position = position;
viewHolder.text.setEllipsize(TruncateAt.END);
viewHolder.text.setTypeface(typeFace);
viewHolder.image.setOnClickListener(this);
viewHolder.image.setOnLongClickListener(this);
convertView.setTag(viewHolder);
} else {
viewHolder = (DisplayImageGridViewHolder) convertView.getTag();
}
viewHolder.position = position;
imageLoader.loadImage(imageLinkList.get(position), viewHolder.image);
return convertView;
ont ajouté , je viens de l'appeler une méthode pour démarrer le chargement la tâche à un thread de travail , j'ai vérifier, avant et après cette méthode getview , il n'passer mon fews moulins secondes , pensez-vous setimagebitmap est quelque chose de problème lors du défilement gridview
Votre code est encore un peu floues. Vous pouvez poster votre ensemble de la classe ImageLoader. J'utilise très semblable code, éventuellement en se basant sur le même exemple et avoir de travail sans retard.
oh je vois , vous êtes à l'aide de celui, similaire , que diriez-vous comment faire pour afficher l'image sur gridview ?? si vous faites défiler rapide , est un peu gal ?? je viens de changer le montrant bitmap méthode de runonuithread de gestionnaire postdelayed , le reste est de même .
Je viens de l'utiliser AsyncTasks pour charger les images. Charger l'image à partir du web / local de stockage / mémoire doInBackground. Ensuite, réglez l'image en onPostExecute.
OriginalL'auteur rex | 2012-04-25
Vous devez vous connecter pour publier un commentaire.
Ci-dessous est un exemple de la LazyLoader que j'utilise. Remarque, je suis en utilisant SoftReferences pour les bitmaps, c'est maintenant mieux servi en utilisant
LruCache
.Cela va charger une image de manière asynchrone à partir du web /sdcard /de la mémoire et de créer un fondu en effet à partir d'une image d'espace réservé.
Vous l'appeler comme ceci:
OriginalL'auteur David Scott
Essayer de faire en sorte que chaque image bitmap de taille de manière optimale... ils devraient être d'environ la taille du récipient. La mise à l'échelle vers le bas autant que vous pouvez avant de les envoyer à travers RemoteViews. Vous pouvez calculer la taille de widget à l'aide de onAppWidgetOptionsChanged.
Aussi, essayez d'utiliser setImageViewUri (avec un fournisseur de contenu) au lieu de setImageViewBitmapfor la performance la plus optimale.
OriginalL'auteur RCB