2011-08-06 5 views
2

Android Honeycomb에서 갤러리보기 위젯을 빠르게 할 수있는 좋은 방법을 찾고 있습니다. 저는 현재 약 340 x 600 픽셀의 꽤 큰 이미지를 보여주기 위해이 이미지를 사용하고 있습니다. 이미지를 스크롤 할 때 버터처럼 부드럽게 사용하고 싶습니다.안드로이드에서 갤러리 위젯을 가속화하기위한 팁 벌집

지금은 상당히 빠르지 만, ScrollView를 ImageViews로로드하고 스크롤하는 것과는 비교할 수 없습니다.

여기 내 사용자 지정 BaseAdapter에서 내 getView() 방법의 단순화 된 버전입니다 :

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

     if (convertView == null) { 
      convertView = (ImageView) new ImageView(Main.this); 
     } 

     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inPurgeable = true; 

     ((ImageView) convertView).setImageBitmap(createReflection(BitmapFactory.decodeFile(ImageFile, options))); 

     convertView.setPadding(20, 0, 20, 0); 

     return convertView; 
    } 

내가 게으른 로딩 이미지와 실험을했습니다,하지만 난 결과처럼 정말하지 않았다.

+0

성능 문제가있는 곳을 측정하기 위해 Traceview를 실행했을 때 Traceview에서 무엇을 보여줬습니까? – CommonsWare

+0

나는 당신에게 말하고 싶지만 이클립스에서 Traceview를 사용할 수 없다. ( –

+0

) Traceview는 getView()가 호출 될 때마다 52ms를 말하고, 46 ~ 48ms 사이에 이미지를 디코딩하는 데 사용됩니다. 표준 1.0GHz 대신 1.2GHz의 오버 클럭킹 태블릿에서 실행 중이므로 기본 시계 속도가 느려질 것으로 예상됩니다. –

답변

2

Gallery 및 사용의 차이 :

ImageViews와있는 ScrollView을로드하고 그

스크롤은 ScrollView 시나리오, 당신이하는 모든 이미지를 사전로드 Gallery 시나리오와 같이 즉시로드하는 것이 좋습니다.

이미지 수가 적 으면 모두 지원할 수있는 충분한 RAM이있는 경우 ScrollView을 사용하십시오.

그 외에도 AFAIK에는 할 수있는 톤이 없습니다. Gallery에서 현재 이미지보다 약간의 이미지를 계속해서 디코딩하고 캐시에서 Adapter을 가져 오는 비트 맵 캐시를 유지 관리 할 수 ​​있습니다. 그러나 이것은 지금까지만 얻을 수 있습니다. 작은 두루마리는 매끄 럽지 만, 캐시 용량을 초과하여도 여전히 디코딩이 요구 될 것입니다. 그것은 거의 피할 수없는 일입니다.

+0

그래, 그 대답을 기대하고 있습니다. 그게 얼마나 많은 ImageViews가 표시되는지 확신 할 수 없다는 것입니다 - 그것은 수천에서 수천 사이에있을 수 있기 때문에, 나는 그것들을 미리 미리로드 할 수 없습니다. 그것은 어플리케이션의 초기 버전에서했던 것입니다. 하지만 더 많은 이미지가 표시되어 일부 사용자에게는 OOM 오류가 발생했습니다 (각 이미지는 영화의 커버 아트입니다 - 시각적 설명을 위해 시장에서 Mizuu 영화를 확인하는 영화 관리 응용 프로그램에서 작업하고 있습니다) 그 생각을 해왔다. 스크롤하는 동안 작은 이미지를로드 할 수는 있지만 실제로는 모르겠다. –

+0

이미지의 병렬 저해상도 렌더링을 만들어 미리 정적 인 것보다는 지연로드에 대한 자리 표시 자로 사용하려고 할 수있다. 자리 표시 자. Android는 저해상도 이미지를 늘릴 수 있습니다. Google지도 타일을 확대/축소 할 때 얻을 수있는 효과가 더 많거나 적습니다. 스케일 된 고해상도 이미지가 픽셀 화되지 않도록 흐림 효과를 시도 할 수도 있습니다. 저해상도 파일 크기를 ~ 1K로 유지할 수 있으면 수천 개의 파일을로드 할 수 있습니다. 여기에 브레인 스토밍을 해본 적이 있는데,이 기술을 한번도 시도한 적이 없다는 사실에 유의하십시오. :-) – CommonsWare

+0

감사합니다. CW. 나는 게으른 다른 게으른로드를 아마 ​​줄 것이다! :) –

2

갤러리에서 현재 convertView를 지원하지 않습니다. convertView는 항상 null을받습니다. 이것은 알려진 이슈이며 수정을위한 ETA가 없습니다.

+0

실제로 Gallery 대신 HorizontalListView를 추가 할 계획이 있습니까? 어쨌든 대부분의 사람들이 원하는 것 같습니다 :) – alexanderblom

+0

지금은 그런 계획이 없습니다. 그리고 그것은 Gallery가 이미 가지고있는 것입니다. –

+0

나는 본다. 설명 해줘서 고마워, Romain. 나는 그것이 곧 해결 될 것이기를 바랍니다. –

0

한 매니페스트 안드로이드의 응용 프로그램 요소입니다. 1280x720 해상도의 사진이있는 슬라이드 쇼 앱에서 작업하고 있습니다. 실제 파일 입출력은 각 파일에 대해 300-400 밀리 초가 걸립니다.

파일 I/O는 일반적으로 UI 스레드에서 실행되므로 진행중인 사진 전환에서 매우 눈에 띄는 "hick"이 표시됩니다. 이를 방지하기 위해

, 당신은해야합니다

  1. 이미 imageView.setImageResource (R.drawable.my_loading_drawable를) 캐시 임시 로딩 드로어 블을 설정;
    • 은 doInBackground에 드로어 블을로드하는 AsyncTask를 만듭니다.파일 I/O)
    • onPostExecute의 imageView를 업데이트하십시오. imageView.setImageDrawable (drawable);

PS 여러 이미지를 통해 사용자 제스처는, 상기 방법은 일반적으로 모든 파일 I/O를 사용한다 여러 • 병렬 AsyncTask를 트리거됩니다. 실적이 좋지 않아 앱이 다운 될 수 있습니다. 한 번에 하나의 비동기 작업 만 허용하는 구조화 된 접근 방식을 사용해야합니다.