2011-10-17 2 views
2

나는 ~ 40 개 이미지를 GalleryView을 사용하고 더 재활용 ...안드로이드 GalleryView 재활용

누구나 getView 방법에 나에게 GalleryView에 기본 재활용을 보여줄 수 있기 때문에 속도가 느린거야. 대신 당신이 원하는보기로 convertView을 변환해야 getView에 새로운 ImageView을 만드는

public class ImageAdapter extends BaseAdapter { 
    int mGalleryItemBackground; 
    private Context mContext; 

    private Integer[] mImageIds = { 
      R.drawable.sample_1, 
      R.drawable.sample_2, 
      R.drawable.sample_3, 
      R.drawable.sample_4, 
      R.drawable.sample_5, 
      R.drawable.sample_6, 
      R.drawable.sample_7 
    }; 

    public ImageAdapter(Context c) { 
     mContext = c; 

     TypedArray a = c.obtainStyledAttributes(R.styleable.HelloGallery); 
     mGalleryItemBackground = a.getResourceId(
       R.styleable.HelloGallery_android_galleryItemBackground, 0); 
     a.recycle(); 
    } 

    public int getCount() { 
     return mImageIds.length; 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView i = new ImageView(mContext); 

     i.setImageResource(mImageIds[position]); 
     i.setLayoutParams(new Gallery.LayoutParams(150, 100)); 
     i.setScaleType(ImageView.ScaleType.FIT_XY); 
     i.setBackgroundResource(mGalleryItemBackground); 

     return i; 
    } 
} 
+0

재활용 의미? whbl prblm occure가 발생합니까? –

답변

5

. 여기 한 가지 방법의 예입니다

public View getView(int position, View cv, ViewGroup parent) { 

    if (! convertView istanceof ImageView) 
    { 
     ImageView cv = new ImageView(mContext); 
     cv.setLayoutParams(new Gallery.LayoutParams(150, 100)); 
     cv.setScaleType(ImageView.ScaleType.FIT_XY); 
     cv.setBackgroundResource(mGalleryItemBackground); 

    } 
    cv.setImageResource(mImageIds[position]); 

    return cv; 
} 

는 단순히 convertView 당신이 원하는 것을 일치하도록 변환하지만, 먼저 적절한보기 유형 확인합니다.

업데이트 : 이미지를 표시하기 전에 이미지를 다운 샘플링해야합니다. res/drawable에 500x500 픽셀 이미지가 저장되어 있다고 가정하지만 이미지는 화면에서 125x125 픽셀 만 차지합니다. 이미지를 표시하기 전에 이미지를 다운 샘플링해야합니다. 비트 맵을 다운 샘플링 할 필요가 얼마나 알고 먼저

int maxSize = 125; // make 125 the upper limit on the bitmap size 
int resId; // points to bitmap in res/drawable 

BitmapFactory.Options opts = new BitmapFactory.Options(); 
opts.inJustDecodeBounds = true; // Only get the bitmap size, not the bitmap itself 
BitmapFactory.decodeResource(c.getResources(), resId, opts); 

int w = opts.outHeight, h = opts.outHeight; 
int maxDim = (w>h)?w:h; // Get the bigger dimension 

이제 우리는 크기를 가지고 있다는 이미지를 다운 샘플링하는 방법을 많이 계산 크기 받아야합니다. 우리는 500x500 비트 맵을 가지고 우리는 125x125의 비트 맵을 원하는 경우에 우리는 우리가

int inSample = maxDim/maxSize; 

opts = new BitmapFactory.Options(); 
opts.inSampleSize = inSample; 

지금 단순히 자원을 디코딩 int inSample = 500/125;에서 얻을 매 4 개 픽셀 중 하나를 유지하고 우리는 우리의 다운 샘플링 비트 맵을 가지고있다.

Bitmap b = BitmapFactory.decodeResource(c.getResources(), resId, opts); 

원래 비트 맵은 영향을받지 않습니다. 이미지를 다시 디코드하고 opts.inSampleSize1으로 설정하면 전체 500x500 비트 맵 이미지를 얻을 수 있습니다.

+0

시도했지만 여전히 천천히, 무엇을 더 할 수 있습니까? 이미지 해상도와 관련이있을 수 있습니까? (이미지 500x500) – musa

+2

당신은 확실히 이미지를 축소해야합니다. 픽셀 당 16 비트에서 500x500 비트 맵에는 ~ 4MB의 RAM이 필요합니다. 반면 125x125 이미지는 ~ 250KB의 RAM 만 필요합니다. – slayton

+0

예, 이미지는 500x500이어야합니다. 각 이미지의 축소판에 추가 하시겠습니까? images1.jpg, images1_thumb.jpg 갤러리에서이 이미지를 사용합니다. 그러나 이것은 여분의 공간을 의미합니다. 제안 할 수 있니? – musa

4

갤러리 위젯에는 실제로 null convertView가 반환되는 버그가 있습니다. 즉, convertView를 사용하는 getView 메소드를 구현하더라도 성능을 얻지는 못하기 때문에 항상 새 값을 생성하기 때문에 성능이 향상됩니다. 하나 개의 가능한 솔루션

Check out this answer

. 이 사람은 기본적으로 갤러리 위젯을 가져 와서 필요한 수정을했습니다. EcoGallery를 다운로드하여 자신의 패키지에 포함하면 적절하게 재활용되는 갤러리 위젯을 사용할 수 있습니다. 다른 옵션은 다음과 같습니다. (1) View 객체의 캐시를 보유하고 사용하기위한 자체 로직을 구현하십시오. (2) 다른 위젯보기 조합을 찾아 갤러리와 비슷한 효과를 얻고 실제 갤러리 위젯 대신 사용하십시오.

이 EcoGallery를 다운로드하려면 사이트에 나열된 3 개의 Java 파일이 필요하며 SDK에서 2 개의 다른 XML 파일을 가져 와서 프로젝트에 포함시켜야합니다.

관련 문제