歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android的gallery實現無限循環和降低選擇頻率

Android的gallery實現無限循環和降低選擇頻率

日期:2017/3/1 11:09:25   编辑:Linux編程
gallery是一個很好用的控件,可以實現很炫的效果。不過有的時候要對gallery進行改造,使其效果更完美。

Gallery組件主要用於橫向顯示圖像列表,不過按常規做法。Gallery組件只能有限地顯示指定的圖像。也就是說,如果為Gallery組件指定了10張圖像,那麼當Gallery組件顯示到第10張時,就不會再繼續顯示了。為了實現像UCWeb的循環顯現導航菜單,要進行相應的改造。

循環顯示有些類似於循環鏈表,最後一個結點的下一個結點又是第1個結點。循環顯示圖像也可以模擬這一點。

如果這時Gallery組件正好顯示到最後一個圖像,position參數值正好為getCount() - 1。那麼我們如何再讓Gallery顯示下一個圖像呢?也就是說讓position參數值再增1,對!將getCount()方法的返回值也增1。

那麼這裡還有一個問題,如果position參數值無限地增加,就意味著resIds數組要不斷地增大,這樣會大大消耗系統的資源。想到這,就需要解決兩個問題:既要position不斷地增加,又讓resIds數組中保存的圖像資源ID是有限的,該怎麼做呢?對於getCount()方法非常好解決,可以讓getCount方法返回一個很大的數,例如,Integer.MAX_VALUE。這時position參數值就可以隨著Gallery組件的圖像不斷向前移動而增大。現在resIds數組只有15個元素,如果position的值超過數組邊界,要想繼續循環取得數組中的元素(也就是說,當position的值是15時,取resIds數組的第0個元素,是16時取第1個元素),最簡單的方法就是取余,代碼如下:

resIds[position % resIds.length]

對ImageAdapter類做了如下兩個改進:

1. 使getCount方法返回一個很大的值。建議返回Integer.MAX_VALUE。

2. 在getView方法中通過取余來循環取得resIds數組中的圖像資源ID。

通過上面兩點改進,可以使圖像列表在向右移動時會循環顯示圖像。當然,這種方法從本質上說只是偽循環,也就是說,如果真把圖像移動到getCount方法返回的值那裡,那也就顯示到最後一個圖像的。不過在這裡getCount方法返回的是Integer.MAX_VALUE,這個值超過了20億,除非有人真想把圖像移動到第20億的位置,否則Gallery組件看著就是一個循環顯示圖像的組件。代碼如下:

  1. public class ImageAdapter extends BaseAdapter
  2. {
  3. int mGalleryItemBackground;
  4. private Context mContext;
  5. public ImageAdapter(Context context)
  6. {
  7. mContext = context;
  8. TypedArray typedArray = obtainStyledAttributes(R.styleable.Gallery);
  9. mGalleryItemBackground = typedArray.getResourceId(
  10. R.styleable.Gallery_Android_galleryItemBackground, 0);
  11. }
  12. // 第1點改進,返回一個很大的值,例如,Integer.MAX_VALUE
  13. public int getCount()
  14. {
  15. return Integer.MAX_VALUE;
  16. }
  17. public Object getItem(int position)
  18. {
  19. return position;
  20. }
  21. public long getItemId(int position)
  22. {
  23. return position;
  24. }
  25. public View getView(int position, View convertView, ViewGroup parent)
  26. {
  27. ImageView imageView = new ImageView(mContext);
  28. // 第2點改進,通過取余來循環取得resIds數組中的圖像資源ID
  29. imageView.setImageResource(resIds[position % resIds.length]);
  30. imageView.setScaleType(ImageView.ScaleType.FIT_XY);
  31. imageView.setLayoutParams(new Gallery.LayoutParams(163, 106));
  32. imageView.setBackgroundResource(mGalleryItemBackground);
  33. return imageView;
  34. }
  35. }

gallery菜單滑動有一個不好的效果就是每次經過中間的菜單都默認是被選中狀態,同時會加載數據 以至於切換不流暢,有一種卡卡的感覺!!其實用線程來處理這個問題,一定的時間後如果選擇的index值不變,說明已經穩定不變。

  1. //----------------------用到的常量-----------------------------
  2. private int showingIndex = -1;
  3. private static final int TIME_OUT_DISPLAY =300;
  4. private int toShowIndex = 0;
  5. //--------------------------------------------------
  6. //在選中事件裡面做處理
  7. public void onItemSelected(AdapterView<?> parent, View v, final int position,
  8. long id) {
  9. //--------------------------------------------------
  10. toShowIndex = position;
  11. final Handler handler = new Handler() {
  12. @Override
  13. public void handleMessage(Message msg) {
  14. if(showingIndex != toShowIndex){
  15. showingIndex = toShowIndex;
  16. menu_position = position;
  17. //做你的業務邏輯處理
  18. }
  19. }
  20. };
  21. Thread checkChange = new Thread() {
  22. @Override
  23. public void run() {
  24. int myIndex = toShowIndex;
  25. try {
  26. sleep( TIME_OUT_DISPLAY );
  27. if( myIndex == toShowIndex ){
  28. handler.sendEmptyMessage(0);
  29. }
  30. } catch (InterruptedException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. };
  35. checkChange.start();
  36. }
Copyright © Linux教程網 All Rights Reserved