編輯:Android開發實例
: ,一個Gallery是歌曲專輯圖片,另一個Gallery是專輯的歌曲。滑動專輯Gallery,下面的歌曲也會隨之發生變動。
一、布局。
主要的布局是有兩個相對布局+兩個Gallery組成的:
1: <?xml version="1.0" encoding="utf-8"?>
2: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3: android:layout_width="fill_parent"
4: android:layout_height="fill_parent">
5: <!-- 專輯 -->
6: <Gallery android:id="@+id/gallery"
7: android:layout_width="fill_parent"
8: android:layout_height="wrap_content"
9: android:layout_alignParentTop="true"
10: android:gravity="center_horizontal"
11: android:spacing="16dp"
12: android:unselectedAlpha="0.5"/>
13: <!-- 歌曲 -->
14: <Gallery android:id="@+id/gallery2"
15: android:background="#FFF"
16: android:layout_width="fill_parent"
17: android:layout_height="30dp"
18: android:layout_below="@id/gallery"
19: android:layout_alignParentLeft="true"
20: android:gravity="center_vertical"
21: android:spacing="16dp"
22: android:unselectedAlpha="0.5" />
23: </RelativeLayout>
二、Gallery的適配器
在android中適配器很好的實現了MVC思想,它很好的為某些組件提供了數據和view的實現。此處我們需要通過繼承BaseAdapter,實現兩個Gallery的適配器。
1: /**
2: * 專輯
3: *
4: * @author halzhang
5: */
6: public class AlbumAdapter extends BaseAdapter {
7:
8: private Context context;
9:
10: private Cursor cursor;
11:
12: private Bitmap[] bitmaps;
13:
14: public AlbumAdapter(Context context) {
15: this.context = context;
16: this.cursor = context.getContentResolver().query(
17: MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, null, null, null,
18: MediaStore.Audio.Albums.DEFAULT_SORT_ORDER);
19: bitmaps = new Bitmap[cursor.getCount()];
20: initBitmaps();
21: }
22:
23: /**
24: * 初始化專輯封面圖片
25: */
26: private void initBitmaps() {
27: if (cursor.moveToFirst()) {
28: do {
29: bitmaps[cursor.getPosition()] = MusicUtils.getArtwork(context, -1, cursor
30: .getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums._ID)));
31: } while (cursor.moveToNext());
32: }
33: }
34:
35: public int getCount() {
36: if (cursor != null) {
37: return cursor.getCount();
38: }
39: return 0;
40: }
41:
42: public Object getItem(int position) {
43: return position;
44: }
45:
46: public long getItemId(int position) {
47: if (cursor != null) {
48: cursor.moveToPosition(position);
49: return cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums._ID));
50: }
51: return 0;
52: }
53:
54: public View getView(int position, View convertView, ViewGroup parent) {
55: ImageView iv = new ImageView(context);
56: iv.setLayoutParams(new Gallery.LayoutParams(100, 100));
57: iv.setAdjustViewBounds(true);
58: iv.setImageBitmap(bitmaps[position]);
59: return iv;
60: }
61:
62: }------------------------------------------
1: /**
2: * 歌曲
3: *
4: * @author halzhang
5: */
6: public class AudioAdapter extends BaseAdapter {
7:
8: private Context context;
9:
10: private Cursor cursor;
11: /**專輯ID*/
12: private int albumId;
13:
14: public AudioAdapter(Context context, int albumId) {
15: this.context = context;
16: this.albumId = albumId;
17: this.cursor = context.getContentResolver().query(
18: MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,
19: MediaStore.Audio.Media.ALBUM_ID + "=" + albumId, null,
20: MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
21: }
22:
23: public int getCount() {
24: if (cursor != null) {
25: return cursor.getCount();
26: }
27: return 0;
28: }
29:
30: public Object getItem(int position) {
31: return position;
32: }
33:
34: public long getItemId(int position) {
35: if (cursor != null) {
36: cursor.moveToPosition(position);
37: return cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
38: }
39: return 0;
40: }
41:
42: public View getView(int position, View convertView, ViewGroup parent) {
43: cursor.moveToPosition(position);
44: TextView t = new TextView(context);
45: String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
46: t.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT,
47: LayoutParams.WRAP_CONTENT));
48: t.setText(title);
49: t.setTextColor(Color.BLACK);
50: return t;
51: }
52:
53: /**
54: * 當專輯改變了,調用此方法更新adapter的數據
55: * @param albumId 專輯ID
56: */
57: public void notifyDataSetChanged(int albumId) {
58: this.cursor = context.getContentResolver().query(
59: MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,
60: MediaStore.Audio.Media.ALBUM_ID + "=" + albumId, null,
61: MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
62: super.notifyDataSetChanged();
63: }
64:
65: }
三、Activity
1: public class MainActivity extends Activity implements AdapterView.OnItemSelectedListener {
2:
3: private Gallery album;
4:
5: private Gallery audio;
6:
7: private AlbumAdapter albumAdapter;
8:
9: private AudioAdapter audioAdapter;
10:
11: @Override
12: protected void onCreate(Bundle savedInstanceState) {
13: super.onCreate(savedInstanceState);
14: setContentView(R.layout.audio_player);
15: setupViews();
16: }
17:
18: // 個人習慣
19: private void setupViews() {
20: album = (Gallery) findViewById(R.id.gallery);
21: audio = (Gallery) findViewById(R.id.gallery2);
22:
23: albumAdapter = new AlbumAdapter(this);
24:
25: album.setAdapter(albumAdapter);
26:
27: int aid = (int) albumAdapter.getItemId(0);
28:
29: audioAdapter = new AudioAdapter(this, aid);
30: audio.setAdapter(audioAdapter);
31:
32: audio.setOnItemSelectedListener(this);
33: album.setOnItemSelectedListener(this);
34: }
35:
36: public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
37: if (parent == album) {
38: // 專輯被選中
39: int aid = (int) albumAdapter.getItemId(position);
40: // 更新歌曲Gallery
41: audioAdapter.notifyDataSetChanged(aid);
42: } else if (parent == audio) {
43: // TODO do something
44: }
45:
46: }
47:
48: public void onNothingSelected(AdapterView<?> parent) {
49:
50: }
OK,代碼貼的有點多了。歡迎交流。
轉自:http://www.cnblogs.com/halzhang/archive/2010/08/07/1794555.html
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
有一種需要,我們在菜單項中點擊退出應用程序,應用程序就退出,不需要回到MainActivity設計:有兩個應用界面MainActivity和BActivity,以
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩