【发布时间】:2015-11-17 22:26:02
【问题描述】:
我认为我的图像适配器有问题.. 当我通过 gridview 滚动时,它会严重结巴。我想我忽略了代码中的某些内容,但我无法弄清楚。
我的图像适配器代码:
public class ImageAdapter extends BaseAdapter
{
private Context context;
public ImageAdapter(Context c)
{
context = c;
}
//---returns the number of images---
public int getCount() {
return logoCount;
}
//---returns the ID of an item---
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
//---returns an ImageView view---
public View getView(int position, View convertView, ViewGroup parent)
{
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(context);
imageView.setLayoutParams(new GridView.LayoutParams(300, 300));
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
imageView.setPadding(5, 5, 5, 5);
} else {
imageView = (ImageView) convertView;
}
Drawable drawable = null;
switch(GetLogoStatus(position)) {
case 1:
drawable = ContextCompat.getDrawable(context, R.drawable.check);
break;
case 2:
drawable = ContextCompat.getDrawable(context, R.drawable.tipsused);
break;
case 3:
drawable = ContextCompat.getDrawable(context, R.drawable.cross);
break;
}
final Bitmap largeImage = ((BitmapDrawable) drawable).getBitmap().copy(Bitmap.Config.ARGB_8888, true);
final Drawable logoDrawable = ContextCompat.getDrawable(context, GetImage(position));
Bitmap smallImage = ((BitmapDrawable) logoDrawable).getBitmap().copy(Bitmap.Config.ARGB_8888, true);
final Canvas canvas = new Canvas(largeImage);
float ratioBitmap = (float) smallImage.getWidth() / (float) smallImage.getHeight();
float ratioMax = (float) largeImage.getWidth() / (float) largeImage.getHeight();
int finalWidth = largeImage.getWidth();
int finalHeight = largeImage.getHeight();
if (ratioMax > 1) {
finalWidth = (int) ((float)largeImage.getHeight() * ratioBitmap);
} else {
finalHeight = (int) ((float)largeImage.getWidth() / ratioBitmap);
}
smallImage = Bitmap.createScaledBitmap(smallImage, finalWidth, finalHeight, true);
int startX= (canvas.getWidth()-smallImage.getWidth())/2;
int startY=(canvas.getHeight()-smallImage.getHeight())/2;
canvas.drawBitmap(smallImage,startX, startY, null);
imageView.setImageBitmap(largeImage);
//imageView.setImageResource(GetImage(position));
return imageView;
}
}
希望有人能帮帮我:)
【问题讨论】:
-
看起来你在主线程上做了很多缩放等等,这很可能会有所贡献。你可以将工作转移到另一个线程上(注意同时引用仍然存在),或者你可以给毕加索图书馆一个镜头,它可以为你处理很多事情。
-
除此之外,使用 Traceview 等工具来确定您将时间花在哪里。我的猜测是,由于垃圾收集过多,您正在死去,因为您每行都会产生大量垃圾。与其创建一堆位图,不如创建您自己的
View子类来进行缩放和渲染。 -
@ReinS 我应该将代码的哪些部分放入线程以获得更好的性能?
-
@CommonsWare 子类是什么意思?
-
跟我说的差不多。您可以创建自己的
View的自定义子类,覆盖onDraw()等方法,并将图像直接渲染到Canvas,而不是创建一堆位图。
标签: android image gridview bitmap