之前我们曾向您介绍过在Android中实现service动态更新UI界面,在UI设计中需要利用很多图库相册软件,而Gallery 是国外一个免费开源的、功能非常强大、有丰富的扩展图库相册软件。本文将讲解利用两个Gallery实现类似多级联动的功能。

device

一个Gallery是歌曲专辑图片,另一个Gallery是专辑的歌曲。滑动专辑Gallery,下面的歌曲也会随之发生变动。

Gallery布局

主要的布局是有两个相对布局+两个Gallery组成的:

  1.  1: <?xml version="1.0" encoding="utf-8"?> 
  2.  2: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"   
  3.  3:     android:layout_width="fill_parent"   
  4.  4:     android:layout_height="fill_parent">   
  5.  5:     <!-- 专辑 --> 
  6.  6:     <Gallery android:id="@+id/gallery" 
  7.  7:         android:layout_width="fill_parent" 
  8.  8:         android:layout_height="wrap_content" 
  9.  9:         android:layout_alignParentTop="true" 
  10. 10:         android:gravity="center_horizontal" 
  11. 11:         android:spacing="16dp" 
  12. 12:         android:unselectedAlpha="0.5"/> 
  13. 13:     <!-- 歌曲 --> 
  14. 14:     <Gallery android:id="@+id/gallery2" 
  15. 15:         android:background="#FFF" 
  16. 16:         android:layout_width="fill_parent" 
  17. 17:         android:layout_height="30dp" 
  18. 18:         android:layout_below="@id/gallery" 
  19. 19:         android:layout_alignParentLeft="true" 
  20. 20:         android:gravity="center_vertical" 
  21. 21:         android:spacing="16dp" 
  22. 22:         android:unselectedAlpha="0.5" /> 
  23. 23: </RelativeLayout> 

Gallery的适配器

在android中适配器很好的实现了MVC思想,它很好的为某些组件提供了数据和view的实现。此处我们需要通过继承BaseAdapter,实现两个Gallery的适配器。

  1.  1: /**  
  2.  2:  * 专辑  
  3.  3:  *   
  4.  4:  * @author halzhang  
  5.  5:  */  
  6.  6: public class AlbumAdapter extends BaseAdapter {  
  7.  7:    
  8.  8:     private Context context;  
  9.  9:    
  10. 10:     private Cursor cursor;  
  11. 11:    
  12. 12:     private Bitmap[] bitmaps;  
  13. 13:    
  14. 14:     public AlbumAdapter(Context context) {  
  15. 15:         this.context = context;  
  16. 16:         this.cursor = context.getContentResolver().query(  
  17. 17:                 MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, null, null, null,  
  18. 18:                 MediaStore.Audio.Albums.DEFAULT_SORT_ORDER);  
  19. 19:         bitmaps = new Bitmap[cursor.getCount()];  
  20. 20:         initBitmaps();  
  21. 21:     }  
  22. 22:    
  23. 23:     /**  
  24. 24:      * 初始化专辑封面图片  
  25. 25:      */  
  26. 26:     private void initBitmaps() {  
  27. 27:         if (cursor.moveToFirst()) {  
  28. 28:             do {  
  29. 29:                 bitmaps[cursor.getPosition()] = MusicUtils.getArtwork(context, -1, cursor  
  30. 30:                         .getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums._ID)));  
  31. 31:             } while (cursor.moveToNext());  
  32. 32:         }  
  33. 33:     }  
  34. 34:    
  35. 35:     public int getCount() {  
  36. 36:         if (cursor != null) {  
  37. 37:             return cursor.getCount();  
  38. 38:         }  
  39. 39:         return 0;  
  40. 40:     }  
  41. 41:    
  42. 42:     public Object getItem(int position) {  
  43. 43:         return position;  
  44. 44:     }  
  45. 45:    
  46. 46:     public long getItemId(int position) {  
  47. 47:         if (cursor != null) {  
  48. 48:             cursor.moveToPosition(position);  
  49. 49:             return cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums._ID));  
  50. 50:         }  
  51. 51:         return 0;  
  52. 52:     }  
  53. 53:    
  54. 54:     public View getView(int position, View convertView, ViewGroup parent) {  
  55. 55:         ImageView iv = new ImageView(context);  
  56. 56:         iv.setLayoutParams(new Gallery.LayoutParams(100, 100));  
  57. 57:         iv.setAdjustViewBounds(true);  
  58. 58:         iv.setImageBitmap(bitmaps[position]);  
  59. 59:         return iv;  
  60. 60:     }  
  61. 61:    
  62. 62: }  
  1.  1: /**  
  2.  2:  * 歌曲  
  3.  3:  *   
  4.  4:  * @author halzhang  
  5.  5:  */  
  6.  6: public class AudioAdapter extends BaseAdapter {  
  7.  7:    
  8.  8:     private Context context;  
  9.  9:    
  10. 10:     private Cursor cursor;  
  11. 11:     /**专辑ID*/  
  12. 12:     private int albumId;  
  13. 13:    
  14. 14:     public AudioAdapter(Context context, int albumId) {  
  15. 15:         this.context = context;  
  16. 16:         this.albumId = albumId;  
  17. 17:         this.cursor = context.getContentResolver().query(  
  18. 18:                 MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,  
  19. 19:                 MediaStore.Audio.Media.ALBUM_ID + "=" + albumId, null,  
  20. 20:                 MediaStore.Audio.Media.DEFAULT_SORT_ORDER);  
  21. 21:     }  
  22. 22:    
  23. 23:     public int getCount() {  
  24. 24:         if (cursor != null) {  
  25. 25:             return cursor.getCount();  
  26. 26:         }  
  27. 27:         return 0;  
  28. 28:     }  
  29. 29:    
  30. 30:     public Object getItem(int position) {  
  31. 31:         return position;  
  32. 32:     }  
  33. 33:    
  34. 34:     public long getItemId(int position) {  
  35. 35:         if (cursor != null) {  
  36. 36:             cursor.moveToPosition(position);  
  37. 37:             return cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));  
  38. 38:         }  
  39. 39:         return 0;  
  40. 40:     }  
  41. 41:    
  42. 42:     public View getView(int position, View convertView, ViewGroup parent) {  
  43. 43:         cursor.moveToPosition(position);  
  44. 44:         TextView t = new TextView(context);  
  45. 45:         String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));  
  46. 46:         t.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT,  
  47. 47:                 LayoutParams.WRAP_CONTENT));  
  48. 48:         t.setText(title);  
  49. 49:         t.setTextColor(Color.BLACK);  
  50. 50:         return t;  
  51. 51:     }  
  52. 52:    
  53. 53:     /**  
  54. 54:      * 当专辑改变了,调用此方法更新adapter的数据  
  55. 55:      * @param albumId 专辑ID  
  56. 56:      */  
  57. 57:     public void notifyDataSetChanged(int albumId) {  
  58. 58:         this.cursor = context.getContentResolver().query(  
  59. 59:                 MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,  
  60. 60:                 MediaStore.Audio.Media.ALBUM_ID + "=" + albumId, null,  
  61. 61:                 MediaStore.Audio.Media.DEFAULT_SORT_ORDER);  
  62. 62:         super.notifyDataSetChanged();  
  63. 63:     }  
  64. 64:    
  65. 65: }  

Activity

  1.  1: public class MainActivity extends Activity implements AdapterView.OnItemSelectedListener {  
  2.  2:    
  3.  3:     private Gallery album;  
  4.  4:    
  5.  5:     private Gallery audio;  
  6.  6:    
  7.  7:     private AlbumAdapter albumAdapter;  
  8.  8:    
  9.  9:     private AudioAdapter audioAdapter;  
  10. 10:    
  11. 11:     @Override  
  12. 12:     protected void onCreate(Bundle savedInstanceState) {  
  13. 13:         super.onCreate(savedInstanceState);  
  14. 14:         setContentView(R.layout.audio_player);  
  15. 15:         setupViews();  
  16. 16:     }  
  17. 17:    
  18. 18:     // 个人习惯  
  19. 19:     private void setupViews() {  
  20. 20:         album = (Gallery) findViewById(R.id.gallery);  
  21. 21:         audio = (Gallery) findViewById(R.id.gallery2);  
  22. 22:    
  23. 23:         albumAdapter = new AlbumAdapter(this);  
  24. 24:    
  25. 25:         album.setAdapter(albumAdapter);  
  26. 26:    
  27. 27:         int aid = (int) albumAdapter.getItemId(0);  
  28. 28:    
  29. 29:         audioAdapter = new AudioAdapter(this, aid);  
  30. 30:         audio.setAdapter(audioAdapter);  
  31. 31:    
  32. 32:         audio.setOnItemSelectedListener(this);  
  33. 33:         album.setOnItemSelectedListener(this);  
  34. 34:     }  
  35. 35:    
  36. 36:     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {  
  37. 37:         if (parent == album) {  
  38. 38:             // 专辑被选中  
  39. 39:             int aid = (int) albumAdapter.getItemId(position);  
  40. 40:             // 更新歌曲Gallery  
  41. 41:             audioAdapter.notifyDataSetChanged(aid);  
  42. 42:         } else if (parent == audio) {  
  43. 43:             // TODO do something  
  44. 44:         }  
  45. 45:    
  46. 46:     }  
  47. 47:    
  48. 48:     public void onNothingSelected(AdapterView<?> parent) {  
  49. 49:    
  50. 50:     }  

好了,这就是我们介绍的在Android开发中使用Gallery实现“多级联动”的教程,谢谢大家

posted on 2011-04-24 11:07  榆钱沽酒  阅读(605)  评论(0编辑  收藏  举报