Witam.
Od miesiąca bawię się w Eclipse.
Od ok. 3 tygodni próbuję od podstaw napisać launcher bazowany wizualnie na ekran domowy telefonu Nokia N9.
ikony są wyświetlane w Gridview, który pobiera layout w postaci: nazwa aplikacji, ikona, tło ikony i cień.
Tło ikony jest generowane na podstawie ikony aplikacji na który są nakładane efekty.
Aplikacja działa, lecz jest mały problem. Podczas przewijania tła są generowane non-stop, przez co aplikacja mocno klatkuje, ponieważ
cały kod generatora tła jest umieszczony w getView.
Próbowałem umieścić kod generatora w AsyncTask, lecz nie poprawiło to płynności działania.
Myślałem też nad dodaniem obsługi cache, lecz nie wiem, jak się do tego zabrać.
Jak mam przebudować kod, żeby zoptymalizować aplikację?
Kod getView:
public View getView(int position, View convertView, ViewGroup parent) {
View v;
ImageView background;
if(convertView==null)
{
LayoutInflater li = getLayoutInflater();
v = li.inflate(R.layout.single_icon, null);
// if it's not recycled, initialize some attributes
} else {
v = convertView;
}
ResolveInfo resolveInfo = MyAppList.get(position);
ImageView icon = (ImageView) v.findViewById(R.id.icon);
icon.setImageDrawable(resolveInfo.loadIcon(myPackageManager));
TextView title = (TextView) v.findViewById(R.id.title);
title.setText(resolveInfo.loadLabel(myPackageManager));
background = (ImageView) v.findViewById(R.id.background);
//background.setImageDrawable(resolveInfo.loadIcon(myPackageManager));
Drawable drawable = resolveInfo.loadIcon(myPackageManager);
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
Bitmap itmap = Bitmap.createScaledBitmap(bitmap, 5, 5, false);
int touchedRGB = itmap.getPixel(3, 3);
Canvas canvas2 = new Canvas();
//Bitmap mainImage = BitmapFactory.decodeResource(getResources(), R.drawable.base);
Bitmap mainImage = BitmapFactory.decodeResource(getResources(), R.drawable.mask);
Bitmap highlight = BitmapFactory.decodeResource(getResources(), R.drawable.highlight);
Bitmap overlay = BitmapFactory.decodeResource(getResources(), R.drawable.overlay);
Bitmap result = Bitmap.createBitmap(mainImage.getWidth(), mainImage.getHeight(), Bitmap.Config.ARGB_8888);
canvas2.setBitmap(result);
Paint paint = new Paint();
paint.setColor(touchedRGB);
paint.setFilterBitmap(false);
ColorFilter filter = new LightingColorFilter(touchedRGB, 1);
paint.setColorFilter(filter);
canvas2.drawBitmap(mainImage, 0, 0, paint);
//paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
//canvas2.drawBitmap(mask, 0, 0, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.OVERLAY));
canvas2.drawBitmap(overlay, 0, 0, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN));
canvas2.drawBitmap(highlight, 0, 0, paint);
paint.setXfermode(null);
Drawable drawable2 = new BitmapDrawable(getResources(), result);
background.setImageDrawable(drawable2);
return v;
}
Tak wygląda owa aplikacja:
Pomożecie mi rozwiązać mój problem?