A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 allen927 于 2015-12-12 16:00 编辑


同样的课程、老师、就业,更好的学习环境,更低的学习成本!
内地学员,选择长沙校区,靠谱!!!
报名热线:0731-85833115
  QQ  : 2355535415

android基础Day09(多媒体)


(了解)计算机图形表示原理
图片:宽                                                                                   
图片是由每个像素点来组成   像素点:小方块  
图片的大小:宽**每个像素点的大小


(掌握)SdCard加载图片显示

(了解)加载大图片OOM异常

内存溢出

本身的大小:2.65MB
dalvik vm:默认16M   

解决的思路:


(掌握)缩放加载大图片


(了解)图形处理的原理
对图片进行一些简单的处理:
进行旋转   进行平移   缩放
绘图的操作:
android里面所有的显示效果都是绘制出来的。

绘制图片:
操作对象才可以: 有绘图的类
Canvas  :画布    画板       
Paint :画笔   设置颜色   

bitmap:要绘制的图形
paint:
matrix: Matrix 把图片绘制成什么效果。  矩阵  
大学:线性代数   矩阵的运算              
android设计了Matrix这个类  该类里面就封装了一些方法可以对图片进行处理。
3x3的矩阵

(掌握)图形的旋转

ScrollView只能有一个子节点



public class MainActivity extends Activity{

       privateImageView iv_old;
       privateImageView iv_new;
       privateBitmap bitmap;

       @Override
       protectedvoid onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);

              iv_old= (ImageView) findViewById(R.id.iv_old);
              iv_new= (ImageView) findViewById(R.id.iv_new);

              //原图
              bitmap= BitmapFactory.decodeFile("/sdcard/mm.jpg");
              iv_old.setImageBitmap(bitmap);

       }

       publicvoid load(View v){
              //创建空白的图片   要和原图的大小一样
              Bitmap bit = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), bitmap.getConfig());

              //把图片进行旋转处理
              Canvascanvas = new Canvas(bit);//画布  传递的参数必须是一个空白的图片
              Paintpaint = new Paint();//画笔
              Matrix matrix = new Matrix();//矩阵
              //旋转30  以图片的中心为圆心
              matrix.setRotate(30, bitmap.getWidth()/2,bitmap.getHeight()/2);  
              canvas.drawColor(Color.WHITE);//绘制背景为白色
              canvas.drawBitmap(bitmap, matrix, paint);//绘制图片

              //显示
              iv_new.setImageBitmap(bit);
       }

}

(掌握)图片的平移和缩放
平移


缩放


(掌握)图片画画
涂鸦操作

public class MainActivity extends Activity{

       publicstatic final String TAG = "MainActivity";

       privateImageView iv;

       privateBitmap bitmap;

       privateBitmap bit;

       privateCanvas canvas;

       privatePaint paint;
       @Override
       protectedvoid onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);

              iv= (ImageView) findViewById(R.id.iv);
              //获取原图
              bitmap= BitmapFactory.decodeFile("/sdcard/mm.jpg");

              /**
               * 1 创建空白的图片
               * 2 构建Canvas
               * 3 构建画笔
               * 4 画图片
               * 5 画线
               * 6 显示图片
               */
              //1 创建空白的图片
              bit = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), bitmap.getConfig());
              
              //2 构建Canvas
              canvas = new Canvas(bit);
              
              //3 构建画笔
              paint = new Paint();
              
              paint.setColor(Color.GREEN);//设置画笔的颜色   绿色
              
              //4 画图片
              canvas.drawBitmap(bitmap, new Matrix(), paint);
              
              //5 画线
//            canvas.drawLine(0, 0, 100, 100, paint);
              
              //6 显示图片
              iv.setImageBitmap(bit);


              //给图片设置触摸的监听
              iv.setOnTouchListener(new MyOnTouchListener());

       }

       //触摸的监听器
       privateclass MyOnTouchListener implements OnTouchListener{

              //记录按下的点
              privatefloat startX,startY;

              @Override
              publicboolean onTouch(View v, MotionEventevent) {
                     switch(event.getAction()) {//判断事件的动作
                     case MotionEvent.ACTION_DOWN://按下
                            Log.i(TAG,"按下");
                            //获取按下点的坐标
                            startX = event.getX();
                            startY = event.getY();
                            break;
                     caseMotionEvent.ACTION_MOVE://移动
                            Log.i(TAG,"移动");
                            //获取移动的点
                            float stopX = event.getX();
                            float stopY = event.getY();
                            //画线
                            canvas.drawLine(startX, startY, stopX,stopY, paint);
                            //显示图片
                            iv.setImageBitmap(bit);

                            //把移动的点置为开始点
                            startX = stopX;
                            startY = stopY;

                            break;
                     caseMotionEvent.ACTION_UP://弹起
                            Log.i(TAG,"弹起");
                            break;

                     default:
                            break;
                     }
                     return true;//自己处理触摸事件
              }

       }


       publicvoid save(View v){
              //保存一张图片到sdcard     操作sdcard
              try{
                     File file = new File(Environment.getExternalStorageDirectory(),"temp.jpg");
                     OutputStream stream = newFileOutputStream(file);
                     bit.compress(CompressFormat.JPEG, 100, stream);


                     //希望图片保存后  android系统的自带的Gallery应用里面可以看到
                     /**
                      * 原理:MediaProvider应用里面有一个广播接收者   该接收者 接收到广播  就可以扫描sdcard
                      *     相册里面的数据是查询了MediaProvider应用
                      * 操作:发广播给相册应用里面的广播接收者
                      *        <receiver android:name="MediaScannerReceiver">
                                        <intent-filter>
                                            <actionandroid:name="android.intent.action.BOOT_COMPLETED" />
                                        </intent-filter>
                                        <intent-filter>
                                            <actionandroid:name="android.intent.action.MEDIA_MOUNTED" />
                                            <dataandroid:scheme="file" />
                                        </intent-filter>
                                        <intent-filter>
                                            <actionandroid:name="android.intent.action.MEDIA_SCANNER_SCAN_FILE" />
                                            <dataandroid:scheme="file" />
                                        </intent-filter>
                                    </receiver>
                      *
                      */
                     //发送广播
                     Intent intent = new Intent();
                     intent.setAction("android.intent.action.MEDIA_MOUNTED");
                     File dir =Environment.getExternalStorageDirectory();
                     intent.setData(Uri.fromFile(dir));
                     sendBroadcast(intent);
              }catch (Exception e) {
                     e.printStackTrace();
              }
       }

}

(掌握)图片颜色处理-Android版本美图秀秀
图片是有颜色:
#f00 #ff0000 #ffff0000  
argb :三基色  alpha   red  green   blue  

颜色的范围:0-256   最大值:256

核心原理:重绘图片

改变图片的颜色就是对画笔进行操作

图片的颜色:矩阵ColorMatrix  
5x4的矩阵   4 5

public class MainActivity extends Activity{

       privateImageView iv;
       privateBitmap bit;
       privateCanvas canvas;
       privatePaint paint;
       privateBitmap bitmap;

       @Override
       protectedvoid onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              iv= (ImageView) findViewById(R.id.iv);
              SeekBarsb_red = (SeekBar) findViewById(R.id.sb_red);
              SeekBarsb_green = (SeekBar) findViewById(R.id.sb_green);
              SeekBarsb_blue = (SeekBar) findViewById(R.id.sb_blue);
              SeekBarsb_alpha = (SeekBar) findViewById(R.id.sb_alpha);

              bitmap= BitmapFactory.decodeFile("/sdcard/mm.jpg");
              iv.setImageBitmap(bitmap);

              //给拖动条设置最大值
              sb_red.setMax(256);
              sb_green.setMax(256);
              sb_blue.setMax(256);
              sb_alpha.setMax(256);

              //设置滑动改变监听
              MyOnSeekBarChangeListenerl = new MyOnSeekBarChangeListener();
              sb_red.setOnSeekBarChangeListener(l);
              sb_green.setOnSeekBarChangeListener(l);
              sb_blue.setOnSeekBarChangeListener(l);
              sb_alpha.setOnSeekBarChangeListener(l);

              bit= Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),bitmap.getConfig());
              canvas= new Canvas(bit);
              paint= new Paint();

       }

       privateclass MyOnSeekBarChangeListener implements OnSeekBarChangeListener{

              privatefloat r=1,g=1,b=1,a=1;

              //在拖动的过程中一直调用
              @Override
              publicvoid onProgressChanged(SeekBar seekBar, int progress,
                            booleanfromUser) {
                     switch(seekBar.getId()) {
                     caseR.id.sb_red:
                            r= (256 - progress)/(float)256;
                            break;
                     caseR.id.sb_green:
                            g= (256 - progress)/(float)256;
                            break;
                     caseR.id.sb_blue:
                            b= (256 - progress)/(float)256;
                            break;
                     caseR.id.sb_alpha:
                          //透明 当用户拖动到最大  图片完全看不见  0   progress 256  范围:0 - 1  
                            a= (256 - progress)/(float)256;
                            break;

                     default:
                            break;
                     }
                     ColorMatrix matrix = new ColorMatrix();//颜色矩阵
                     matrix.set(new float[]{
                                   r,0,0,0,0,//red
                                   0,g,0,0,0,//green
                                   0,0,b,0,0,//blue
                                   0,0,0,a,0 //alpha   0-1   要把256换算为1  
                     });
                     ColorMatrixColorFilter filter = newColorMatrixColorFilter(matrix);
                     paint.setColorFilter(filter);
                     canvas.drawBitmap(bitmap, new Matrix(), paint);
                     iv.setImageBitmap(bit);
              }

              //开始拖动
              @Override
              publicvoid onStartTrackingTouch(SeekBar seekBar) {

              }

              //停止
              @Override
              publicvoid onStopTrackingTouch(SeekBar seekBar) {

              }

       }


}

需要在4.0的模拟器上进行演示

(掌握)音乐播放器API
MediaPlayer


(了解)音乐播放器方法调用时序图


(掌握)视频播放器
MediaPlayer本身能力是不足的。mp4  3gp     
avi:执行视频的转码   
如果现在你有真机测试  发现可以播放avi ,手机定制商 已经对MediaPlayer类进行修改
测试要在4.0的模拟器

public class MainActivity extends Activity{

       privateEditText et_path;
       privateMediaPlayer mp;
       privateSurfaceView surfaceView;

       @Override
       protectedvoid onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);

              surfaceView= (SurfaceView) findViewById(R.id.surfaceview);
              //亮屏
              surfaceView.setKeepScreenOn(true);

              SurfaceHolder holder = surfaceView.getHolder();
              //SurfaceView把获取的信息直接输出
              holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

              et_path= (EditText) findViewById(R.id.et_path);
              mp= new MediaPlayer();
              mp.reset();//重置
       }

       publicvoid play(View v){
              Stringpath = et_path.getText().toString().trim();
              if(TextUtils.isEmpty(path)){
                     Toast.makeText(this,"歌曲名称为空",0).show();
              }else{
                     try{
                            mp.reset();
                            mp.setDataSource(path);//设置要播放的资源
                            mp.setDisplay(surfaceView.getHolder());//设置显示
                            mp.prepareAsync();//异步准备
                            //设置准备完成的监听
                            mp.setOnPreparedListener(newMediaPlayer.OnPreparedListener() {

                                   @Override
                                   publicvoid onPrepared(MediaPlayer mp) {
                                          mp.start();
                                   }
                            });
                     }catch (Exception e) {
                            //TODO Auto-generated catch block
                            e.printStackTrace();
                     }
              }
       }

       publicvoid pause(View v){
              Buttonbt = (Button) v;
              if(mp.isPlaying()){
                     //点击暂停
                     bt.setText("继续");
                     mp.pause();//暂停
              }else{
                     //点击继续
                     bt.setText("暂停");
                     mp.start();//继续播放
              }
       }

       publicvoid stop(View v){
              mp.stop();//停止
       }

       publicvoid replay(View v){
              //重播
              try{
                     mp.stop();
                     mp.setDisplay(surfaceView.getHolder());//设置显示
                     mp.prepare();//准备
                     mp.seekTo(0);//跳转到开始位置开始播放
                     mp.start();//播放
              }catch (Exception e) {
                     //TODO Auto-generated catch block
                     e.printStackTrace();
              }
       }


       @Override
       protectedvoid onDestroy() {
              super.onDestroy();
              mp.stop();
              mp.release();//释放资源
              mp= null;
       }



}

(掌握)surfaceview
SurfaceView:他是一个控件   
作用:用来显示动态的画面   mp4   相机  游戏   






(掌握)surfaceview的生命周期
Activity完全显示之后才创建,当activity暂停后,该控件就会被销毁。




(掌握)照相机



public class MainActivity extends Activity{

       private Camera camera;

       @Override
       protectedvoid onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              SurfaceViewsurfaceView = (SurfaceView) findViewById(R.id.surfaceview);
              surfaceView.setKeepScreenOn(true);
              SurfaceHolderholder = surfaceView.getHolder();
              holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
              //添加监听
              holder.addCallback(newCallback() {

                     @Override
                     publicvoid surfaceDestroyed(SurfaceHolder holder) {
                            camera.release();//释放资源
                            camera = null;
                     }

                     @Override
                     publicvoid surfaceCreated(SurfaceHolder holder) {
                            try{
                                   //打开相机
                                   camera = Camera.open();//默认打开的是后置摄像头
                                   camera.setPreviewDisplay(holder);//设置预览显示
                                   camera.startPreview();//开始预览
                            }catch (Exception e) {
                                   //TODO Auto-generated catch block
                                   e.printStackTrace();
                            }
                     }

                     @Override
                     publicvoid surfaceChanged(SurfaceHolder holder, int format, int width,
                                   intheight) {

                     }
              });
       }


       publicvoid focus(View v){
              //自动对焦
              camera.autoFocus(null);//对焦功能都是由硬件来完成
       }
       publicvoid takepicture(View v){
              //拍照
              //shutter快门   raw 相机捕获的原始数据      jpeg 相机处理后的数据   都是接口
              camera.takePicture(null, null, new Camera.PictureCallback() {

                     @Override
                     publicvoid onPictureTaken(byte[] data, Camera camera) {
                            try{
                                   //把数据保存 sdcard   sdcard写权限
                                   Filefile = newFile(Environment.getExternalStorageDirectory(),"wuhan06.jpg");
                                   FileOutputStreamfos = new FileOutputStream(file);
                                   fos.write(data);
                                   fos.close();
                                   //相机在拍照后 需要处理图片   相机就被占用了
                                   //重新又画面
                                   camera.startPreview();

                            }catch (Exception e) {
                                   //TODO Auto-generated catch block
                                   e.printStackTrace();
                            }
                     }
              });
       }
}


(掌握)录音机|录像机

public class MainActivity extends Activity{

       privateMediaRecorder recorder;
       privateSurfaceView surfaceView;

       @Override
       protectedvoid onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);

              surfaceView= (SurfaceView) findViewById(R.id.surfaceview);
              surfaceView.setKeepScreenOn(true);
              surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
       }

       publicvoid start(View v) {
              try{
                     //媒体刻录器
                     recorder= new MediaRecorder();
                     //设置音频的来源  麦克风
                     recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                     recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);//设置视频的来源  相机
                     //文件输出的格式 3gp
                     recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                     //设置音频的编码格式
                     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                     //设置视频的编码格式
                     recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
                     Filefile = newFile(Environment.getExternalStorageDirectory(),"shiping.3gp");
                     //指定文件输出的路径
                     recorder.setOutputFile(file.getAbsolutePath());
                     //设置预览显示
                     recorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
                     recorder.prepare();//准备
                     recorder.start();// 开始刻录
              }catch (Exception e) {
                     //TODO Auto-generated catch block
                     e.printStackTrace();
              }
       }

       publicvoid stop(View v) {
         recorder.stop();//停止
         recorder.reset();//重置
         recorder.release();//释放
         recorder = null;
       }
}


(掌握)传感器
传感器:他是一种硬件设备   
声音     重力   距离  温度   速度  。。。
android系统在设计api的时候,就已经对传感器进行了支持。
传感器类型:方向、加速度(重力)、光线、磁场、距离(临近性)、温度等。
方向传感器:   Sensor.TYPE_ORIENTATION
加速度(重力)传感器: Sensor.TYPE_ACCELEROMETER
光线传感器:    Sensor.TYPE_LIGHT
磁场传感器:   Sensor.TYPE_MAGNETIC_FIELD
距离(临近性)传感器: Sensor.TYPE_PROXIMITY
温度传感器:   Sensor.TYPE_TEMPERATURE
开发的应用:
   1.手机可以根据光的强弱来自动调节屏幕的亮度  
   2.当手机在接听电话的时候,靠近耳朵屏幕变暗
   3.公交车防盗  

增加手机的特色  
集成了很多硬件  

生物智能    。。。

(掌握)传感器案例-距离传感器
android设计了api
传感器:Sensor
传感器管理器:SensorManager      TelephonyManager  是一个系统服务
public class MainActivity extends Activity{

       publicstatic final String TAG = "MainActivity";
       privateSensorManager sensorManager;
       privateSensor sensor;
       privateMySensorEventListener listener;

       @Override
       protectedvoid onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              findViewById(R.id.tv).setKeepScreenOn(true);

              //传感器管理器
              sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
              //距离传感器
              sensor= sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
       }

       @Override
       protected void onResume() {
              super.onResume();
              listener = new MySensorEventListener();
              //监听  SensorManager.SENSOR_DELAY_GAME 事件的传输速率
              sensorManager.registerListener(listener, sensor,SensorManager.SENSOR_DELAY_GAME);
       }
      
       @Override
       protected void onPause() {
              super.onPause();
              //取消监听
              sensorManager.unregisterListener(listener);
       }

       privateclass MySensorEventListener implements SensorEventListener{

              //sensor值的改变
              @Override
              publicvoid onSensorChanged(SensorEvent event) {
                     float[] values = event.values;
                     floatdistance = values[0];
                     Log.i(TAG,"distance:"+distance+"厘米");
              }

              //精确度的改变
              @Override
              publicvoid onAccuracyChanged(Sensor sensor, int accuracy) {

              }

       }

}

作业

现在按钮变为  正在下载    下载完成。
知识点:
1 刷新界面   adapter.notifyDataSetChange();
2 刷新就会自动调用getView()方法
3 记录条目的位置

下载资源

Doc笔记
课程视频代码
作业视频代码




点评

做的很不错,希望继续下去!赞  发表于 2016-4-4 12:28

299 个回复

倒序浏览
沙发
回复 使用道具 举报
回复 使用道具 举报
孤独成瘾 来自手机 中级黑马 2015-12-12 21:28:02
板凳
真的不错,何止是6,简直是6的不行
回复 使用道具 举报
vip003 来自手机 中级黑马 2015-12-12 22:01:36
报纸
回复 使用道具 举报
                        
回复 使用道具 举报
看眼界 长见识。我还是基础班!
回复 使用道具 举报
沙发6666666
回复 使用道具 举报
mark一下!
回复 使用道具 举报
基础班飘过
回复 使用道具 举报
huaduwuzhe 来自手机 中级黑马 2015-12-14 14:43:01
11#
不懂啊,期待快点学习
回复 使用道具 举报
战略性马克
回复 使用道具 举报
月夜飘星 来自手机 中级黑马 2015-12-14 18:40:14
13#
学习学习!
回复 使用道具 举报
not@good@enough 来自手机 中级黑马 2015-12-14 19:37:49
14#
经典!已收藏,不谢
回复 使用道具 举报
6666顶一下
回复 使用道具 举报
szb 中级黑马 2015-12-14 23:20:53
16#
666666666666666666666666666666666666666666
回复 使用道具 举报
学习学习。
回复 使用道具 举报
孤独成瘾 来自手机 中级黑马 2015-12-15 21:41:09
18#
不错,学无止境啊
回复 使用道具 举报
labozx 来自手机 中级黑马 2015-12-15 21:42:50
19#
加油!!!!!!!!青春
回复 使用道具 举报
labozx 来自手机 中级黑马 2015-12-15 21:47:22
20#
加油!!!!!!!!青春
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马