您的位置:首页 > 产品设计 > UI/UE

Android基础总结.doc(第七节、 多媒体应用、通知、对话框、UI )

2016-08-02 15:25 525 查看
作者:韩亚飞_yue31313_韩梦飞沙
QQ:313134555

第一节、 
多媒体应用、通知、对话框、UI

一、知识概括

1、多媒体的应用操作

2、Android状态通知

3、常见对话框及UI

二、知识总结

多媒体操作流程图

1、多媒体操作

 

1、音乐播放器的基本操作

MediaPlayer mediaPlayer = new MediaPlayer();

if (mediaPlayer.isPlaying()) {

   mediaPlayer.reset();//重置为初始状态}

mediaPlayer.setDataSource("/mnt/sdcard/god.mp3");

mediaPlayer.prepare();                       

mediaPlayer.start();//开始或恢复播放

mediaPlayer.pause();//暂停播放

mediaPlayer.start();//恢复播放

mediaPlayer.stop();//停止播放

mediaPlayer.release();//释放资源

mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){

//播出完毕事件

public void onCompletion(MediaPlayer arg0) {   mediaPlayer.release();   }});

mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {

// 错误处理事件

public boolean onError(MediaPlayer player, int arg1, int arg2) {

       mediaPlayer.release();

       return false;}});

 

2、音频录音

你可以使用手机进行现场录音,实现步骤如下:

第一步:在功能清单文件AndroidManifest.xml中添加音频刻录权限:

<uses-permissionandroid:name="android.permission.RECORD_AUDIO"/>

第二步:编写音频刻录代码:

MediaRecorderrecorder = new MediaRecorder();

 recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//从麦克风采集声音

 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//内容输出格式

 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//音频编码方式

 recorder.setOutputFile("/mnt/sdcard/itcast.amr");

 recorder.prepare();//预期准备

 recorder.start();   //开始刻录

 ...

 recorder.stop();//停止刻录

 recorder.reset();   //重设

 recorder.release(); //刻录完成一定要释放资源

 

3、歌词操作

 

4、soundPool:

开发游戏的时候会使用到,可以有效的处理大量的音效使用

 

1. SoundPool最大只能申请1M的内存空间,这就意味着我们只能用一些很短的声音片段,而不是用它来播放歌曲或者做游戏背景音乐。

2. SoundPool提供了pause和stop方法,但这些方法建议最好不要轻易使用,因为有些时候它们可能会使你的程序莫名其妙的终止。建议使用这两个方法的时候尽可能多做测试工作,还有些朋友反映它们不会立即中止播放声音,而是把缓冲区里的数据播放完才会停下来,也许会多播放一秒钟。

3. SoundPool的效率问题。其实SoundPool的效率在这些播放类中算是很好的了,但是有的朋友在G1中测试它还是有100ms左右的延迟,这可能会影响用户体验。也许这不能管SoundPool本身,因为到了性能比较好的Droid中这个延迟就可以让人接受了。

在现阶段SoundPool有这些缺陷,但也有着它不可替代的优点,基于这些我们建议大在如下情况中多使用SoundPool:1.应用程序中的声效(按键提示音,消息等)2.游戏中密集而短暂的声音(如多个飞船同时爆炸)

 

演    示:

public class DemoActivity extends Activity {

    int soundid;

    SoundPool pool;

    public voidonCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

        pool = newSoundPool(5, AudioManager.STREAM_MUSIC, 0);

        // 这语句代码 是一个异步的操作

        soundid =pool.load(this, R.raw.ring, 1); //花费一定的时间 }

    public void shoot(Viewview){

           // 因为上面异步的加载声音的操作还没完成

        pool.play(soundid,1.0f, 1.0f, 0, 0, 1.0f);}}

//play方法中的5个参数分别为:声音ID,左声道,右声道,优先级,播放次数,播放速度pool.play(soundID,leftVolume,
rightVolume, priority, loop, rate)。

2、视频播放器

1、视频播放器画面显示

使用MediaPlayer来处理视频内容, 通过SurfaceView来显示视频。

在main.xml布局文件添加用于视频画面绘制的SurfaceView 控件:

<SurfaceVie    android:layout_width="fill_parent"      android:layout_height="240dip"android:id="@+id/surfaceView" />

 

SurfaceView surfaceView =(SurfaceView)this.findViewById(R.id.surfaceView);

surfaceView.getHolder().setFixedSize(176, 144); //设置分辨率

/*下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前*/

surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

 

MediaPlayer mediaPlayer = new MediaPlayer();

mediaPlayer.reset();//重置为初始状态

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

/* 设置Video影片以SurfaceHolder播放 */

mediaPlayer.setDisplay(surfaceView.getHolder());

mediaPlayer.setDataSource("/mnt/sdcard/oppo.mp4");

mediaPlayer.prepare();                       

mediaPlayer.start();//播放

mediaPlayer.pause();//暂停播放

mediaPlayer.start();//恢复播放

mediaPlayer.stop();//停止播放

mediaPlayer.release();//释放资源

 

视频播放的填充器

              holder = sv.getHolder();

              /* 下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前 */

              holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

              // holder.setFixedSize(width,height);

              holder.addCallback(newMyHolderCallback());

视屏的同步加载和异步加载:

加载视频的时候,如果视频过大,加载的时间较长,可以使用一部加载,但是一部加载需要

 

 

3、播放网络视频:

播放网络视频只能播放渐进式格式视频(3gp...)和流媒体视频(rtsp)

流媒体通常使用H246类型视频流。

        public classPlayonlineActivity extends Activity {

              EditTextet_path;

              SurfaceViewsv;

              SurfaceHolderholder;

              MediaPlayerplayer

           public void onCreate(BundlesavedInstanceState) {

              super.onCreate(savedInstanceState);

              setContentView(R.layout.main);

              et_path = (EditText)this.findViewById(R.id.editText1);

              sv = (SurfaceView)this.findViewById(R.id.sv);

              holder =  sv.getHolder();

                     /*下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前 */

                     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

           }

           public void play(View view){

                try {

                  String path =et_path.getText().toString().trim();

                  player = new MediaPlayer();

                     player.setDataSource(path);

                     player.setAudioStreamType(AudioManager.STREAM_MUSIC);

                     player.setDisplay(holder);

                     player.prepareAsync();

                     player.setOnPreparedListener(newOnPreparedListener() {

                            publicvoid onPrepared(MediaPlayer mp) {

                                   player.start();}});  

                     }catch (Exception e) {

                                   System.out.println("error");

                            e.printStackTrace();}}}

3、摄像头的使用

1、基本操作

摄像头主要用于获取图像数据和视频数据。

在main.xml布局文件添加用于显示取景画面的SurfaceView 控件:

<SurfaceView android:layout_width="fill_parent"android:layout_height="240dip"android:id="@+id/surfaceView" />

SurfaceView surfaceView =(SurfaceView)this.findViewById(R.id.surfaceView);

surfaceView.getHolder().setFixedSize(176, 144); //设置分辨率

/*下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前*/

surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

Camera camera = Camera.open();

WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);

Display display = wm.getDefaultDisplay();

Camera.Parameters parameters = camera.getParameters();

parameters.setPreviewSize(display.getWidth(),display.getHeight());//设置预览照片的大小

parameters.setPreviewFrameRate(3);//每秒3帧

parameters.setPictureFormat(PixelFormat.JPEG);//设置照片的输出格式

parameters.set("jpeg-quality", 85);//照片质量

parameters.setPictureSize(display.getWidth(),display.getHeight());//设置照片的大小

camera.setParameters(parameters);

camera.setPreviewDisplay(surfaceView.getHolder());//通过SurfaceView显示取景画面

camera.startPreview();//开始预览

camera.autoFocus(null);//自动对焦

camera.takePicture(null, null, null, jpegCallback);//拍照片

camera.stopPreview();//停止预览

camera.release();//释放摄像头

 

2、刻录视频

第一步:在功能清单文件AndroidManifest.xml中添加音频刻录和照相机权限:

<uses-permissionandroid:name="android.permission.RECORD_AUDIO"/>

 <uses-permissionandroid:name="android.permission.CAMERA"/>

<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

第二步:编写音频刻录代码:

recorder.reset();

recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //从照相机采集视频

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

recorder.setVideoSize(320, 240);

recorder.setVideoFrameRate(3); //每秒3帧

recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); //设置视频编码方式

recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

recorder.setOutputFile("/mnt/sdcard/itcast.3gp");

recorder.setPreviewDisplay(surfaceView.getHolder().getSurface());

recorder.prepare();//预期准备

recorder.start();//开始刻录

...

recorder.stop();//停止刻录

recorder.release(); //刻录完成一定要释放资源

 

4、界面状态

1)Android的状态通知---Notification
如果需要查看消息,可以拖动状态栏到屏幕下方即可查看消息。

发送消息的代码如下:

//获取通知管理器

NotificationManager mNotificationManager = (NotificationManager)                                                                                                         getSystemService(Context.NOTIFICATION_SERVICE);

int icon = android.R.drawable.stat_notify_chat;

long when = System.currentTimeMillis();

//新建一个通知,指定其图标和标题

Notification notification = new Notification(icon, null, when);//第一个参数为图标,第二个参数为短暂提示标题,第三个为通知时间

notification.defaults = Notification.DEFAULT_SOUND;//发出默认声音

Intent openintent = new Intent(this, OtherActivity.class);

PendingIntent contentIntent = PendingIntent.getActivity(this, 0,openintent, 0);//当点击消息时就会向系统发送openintent意图

notification.setLatestEventInfo(this, “标题”, “我是内容",contentIntent);

mNotificationManager.notify(0, notification);//第一个参数为自定义的通知唯一标识

 

public class DemoActivity extends Activity {

public void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

    }

    public void click(Viewview){

           //1.Get a reference to the NotificationManager:

           // 得到一个notification的服务

NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

       // 2.Instantiate theNotification:

Notification notification = newNotification(R.drawable.ic_launcher, "tickertext",System.currentTimeMillis());

           notification.sound= Uri.fromFile(newFile("/sdcard/haha.mp3"));

           notification.flags = Notification.FLAG_NO_CLEAR;

           //3.Define the notification's message and PendingIntent:

           Intent intent = new Intent(this,DemoActivity.class);

    PendingIntentcontentIntent = PendingIntent.getActivity(this, 0, intent, 0);

       notification.setLatestEventInfo(this,"notife 标题","noti 正文",contentIntent);

           //4.Pass the Notification to the NotificationManager:

           manager.notify(0, notification);

    }

}

5、常见对话框

文本提示框:setpositiveButton

选择对话框:setItem

单选按钮框:setSingleChoiceItem

必须手动指定关闭

多选对话框:setMultChoiceItem

进度条:progressBar

调用setProgressStyle()方法设置进度对话框风格。有两种风格:

    ProgressDialog.STYLE_SPINNER 旋体进度条风格 (为默认风格)

    ProgressDialog.STYLE_HORIZONTAL 横向进度条风格

演示:

    switch (v.getId()) {

              caseR.id.button1: // 确定取消的对话框

                     //1.获取一个对话框的创建器

                     AlertDialog.Builderbuilder = new Builder(DemoActivity.this);

                     //2.所有builder设置一些参数

                     builder.setTitle("对话框标题");

                     builder.setMessage("提示 是否退出呀?");

                     builder.setPositiveButton("确定", newDialogInterface.OnClickListener(){

 

                            publicvoid onClick(DialogInterface dialog, int which) {

                                   Toast.makeText(getApplicationContext(),"确定被点击",0).show();}});

                    

                     builder.setNegativeButton("取消", newDialogInterface.OnClickListener() {

                           

                            publicvoid onClick(DialogInterface dialog, int which) {

                                   Toast.makeText(getApplicationContext(),"取消被点击",0).show();}});

                     AlertDialog  dialog = builder.create();

                     dialog.show();

                     break;

              caseR.id.button2:  //pick的对话框

                     //1.获取一个对话框的创建器

                     AlertDialog.Builderbuilder2 = new Builder(DemoActivity.this);

                     builder2.setTitle("pick一个人");

                     finalString [] arr = new String[]{"张三","李四","王五"};

                     builder2.setItems(arr,new DialogInterface.OnClickListener(){

 

                            publicvoid onClick(DialogInterface dialog, int which) {

                                   Toast.makeText(getApplicationContext(),arr[which], 0).show();}});

                     builder2.create().show();

                     break;

              caseR.id.button3:  //带选择 按钮的单选对话框

                     //1.获取一个对话框的创建器

                    

                     AlertDialog.Builderbuilder3 = new Builder(DemoActivity.this);

                     builder3.setTitle("选择一个颜色");

                     finalString [] items = new String[]{"红色","蓝色","黄色"};   

                     builder3.setSingleChoiceItems(items,1, new DialogInterface.OnClickListener(){

 

                            publicvoid onClick(DialogInterface dialog, int which) {

                                   Toast.makeText(getApplicationContext(),items[which], 0).show();

                                   dialog3.dismiss();

                            }});

                     dialog3= builder3.create();

                     dialog3.show();

                     break;

              caseR.id.button4:  //带选择多个 按钮的多选对话框

                     //1.获取一个对话框的创建器

                     AlertDialog.Builderbuilder4 = new Builder(DemoActivity.this);

                     builder4.setTitle("选择若干个颜色");

                     finalString [] items4 = new String[]{"红色","蓝色","黄色"};  

                     builder4.setMultiChoiceItems(items4,new boolean[]{false,false,false}, newDialogInterface.OnMultiChoiceClickListener(){

                            publicvoid onClick(DialogInterface dialog, int which,

                                          booleanisChecked) {

                                   Toast.makeText(getApplicationContext(),items4[which] + " 选择状态"+ isChecked, 0).show();}});

                     builder4.setPositiveButton("确定", newDialogInterface.OnClickListener() {

                           

                            publicvoid onClick(DialogInterface dialog, int which) {   

                            }});

                     dialog3=  builder4.create();

                     dialog3.show();

                     break;

              caseR.id.button5 : //进度条对话框

                     ProgressDialogpd = new ProgressDialog(this);

                     pd.setTitle("提示");

                     pd.setMessage("正在获取数据");

                     pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

                     pd.setMax(100);

                     pd.show();

                     pd.setProgress(50);

                     break;}}

       @Override

       protectedvoid onPause() {

              System.out.println("onpause");

              super.onPause();

       }

6、常用UI

RadioButton

要完成单选框显示,我们需要使用到RadioGroup和RadioButton(单选框),RadioGroup用于对单选框进行分组,相同组内的单选框只有一个单选框能被选中。(例子代码请见下方备注栏)

RadioGroup.check(R.id.dotNet);将id名为dotNet的单选框设置成选中状态。

(RadioButton) findViewById(radioGroup.getCheckedRadioButtonId());//获取被选中的单选框。

RadioButton.getText();//获取单选框的值

调用setOnCheckedChangeListener()方法,处理单选框被选择事件,

把RadioGroup.OnCheckedChangeListener实例作为参数传入

 

CheckBox

每个多选框都是独立的,可以通过迭代所有多选框,然后根据其状态是否被选中再获取其值。

CheckBox.setChecked(true);//设置成选中状态。

CheckBox.getText();//获取多选框的值

调用setOnCheckedChangeListener()方法,处理多选框被选择事件,

把CompoundButton.OnCheckedChangeListener实例作为参数传入

Spinner

 Spinner.getItemAtPosition(Spinner.getSelectedItemPosition());获取下拉列表框的值

 调用setOnItemSelectedListener()方法,处理下拉列表框被选择事件,

 把AdapterView.OnItemSelectedListener实例作为参数传入

SeekBar

 SeekBar.getProgress()获取拖动条当前值

 调用setOnSeekBarChangeListener()方法,处理拖动条值变化事件,

 把SeekBar.OnSeekBarChangeListener实例作为参数传入

Menu

重写Activity的onCreateOptionsMenu(Menu menu)方法,该方法用于创建选项菜单,在用户按下手机的“Menu”按钮时就会显示创建好的菜单,在onCreateOptionsMenu(Menumenu)方法内部可以调用Menu.add()方法实现菜单的添加。

重写Activity的onMenuItemSelected()方法,该方法用于处理菜单被选择事件

 

通过手机上提供的“MENU”按钮可以打开菜单,如果希望通过代码打开菜单,可以调用Activity的openOptionsMenu()方法。

ProgressBar

在代码中操作进度条:

ProgressBar.setMax(100);//设置最大刻度

ProgressBar.setProgress(0);//设置进度条的当前刻度,如果进度条的最大刻度为100,当前刻度为50,进度条将进行到一半。

AutoCompleteTextView

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: