基础学习day11——多媒体

1 计算机表示图形的几种方式
  多媒体:(包含文字 图片 音频 视频)
  图形的大小 = 图片的总像素 * 每个像素的大小
  单色  每个像素最多可以表示2种颜色  只需要使用长度为1的二进制位来表示  那么每个像素占1/8byte 
  16色  每个像素最多可以表示16种颜色 0000 - 1111 那么只需要使用长度为4的二进制表示 那么每个像素占1/2个byte
  256色 每个像素最多可以表示256种颜色  0000 0000 - 1111 1111  那么只需要使用长度8的二进制位表示 那么每个像素占1byte 
  24位 rgb 
       r 1byte   0-255
       g 1byte  0-255
       b 1byte  0-255     那么一个像素占3byte 
jpg 格式
png 格式 Android采用的是png格式 


2 缩放加载加载大图片
09-14 00:59:51.813: E/AndroidRuntime(2128): Caused by: java.lang.OutOfMemoryError
09-14 00:59:51.813: E/dalvikvm-heap(2128): Out of memory on a 30720012-byte allocation.
在Android下采用ARGB来表示颜色  每个像素占4byte
图片:2400*3200
手机:320*480 
宽缩放: 7  
高缩放: 6  
需要考虑的问题 (1)动态获取图片的分辨率 
               (2)动态获取手机分辨率 
       

实现步骤  (***)
(1)获取手机的宽和高  
\
(2)获取图片的宽和高
\
(3)计算缩放比

(4)按照缩放比显示图片 




3 创建原图的副本
  步骤如下
  


4 图形处理的api
  [1]旋转 
     matrix.setRotate( degrees , srcBitmap.getWidth()/2, srcBitmap.getHeight()/2);
  [2]缩放
     matrix.setScale(0.5f, 0.5f);
  [3]位移 
   matrix.setTranslate(20, 0);  
  [4]倒影效果
  
   [5]镜面效果
  


5 画画板小案例
主要代码如下
  
  
//[4]给iv设置一个触摸事件 
		iv.setOnTouchListener(new OnTouchListener() {
			
			int startX = 0;
			int startY = 0;
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				//[5]获取手指触摸的事件类型 
				int action = event.getAction();
				//[6]具体判断一下是什么事件类型 
				switch (action) {
				case MotionEvent.ACTION_DOWN: //按下 
					//[7]获取手指按下坐标 
				    startX = (int) event.getX();
					startY= (int) event.getY();
					System.out.println("按下:"+startX+"---"+startY);
					break;
					
				case MotionEvent.ACTION_MOVE://移动 
					//[8]获取停止的坐标  
					int stopX = (int) event.getX();
					int stopY = (int) event.getY();
					
					System.out.println("移动:"+stopX+"---"+stopY);
					
					//[9]画线 
					canvas.drawLine(startX, startY, stopX, stopY, paint);
					
					//[9.1]更新一下起点坐标 
					startX = stopX;
					startY = stopY;
					
					//[10]记得更新ui 
					iv.setImageBitmap(copyBitmap);
					
					
					break;
					
				case MotionEvent.ACTION_UP: //抬起;
					break;
				}
				return true;
			}
		});
		
		
		
	}



6 撕衣服小案例
  
  
//[5]给iv设置一个触摸事件 
		iv.setOnTouchListener(new OnTouchListener() {
			
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				//[6]获取触摸事件的类型 
				int action = event.getAction();
				switch (action) {
					
				case MotionEvent.ACTION_MOVE: //移动  
					
					for (int i = -7; i < 7; i++) {  //改变x 
						
						for (int j = -7; j <7; j++) {
							//为了 良好的用户体验 撕一个圆 
							if (Math.sqrt(i*i+j*j)<7) {
								//一次修改一个像素 
								try {
									alterbBitmap.setPixel((int)event.getX()+i, (int)event.getY()+j, Color.TRANSPARENT);
								} catch (Exception e) {
								}
							}
							
							
						}
						
					}
				
					
					//一定要记得更新iv
					iv.setImageBitmap(alterbBitmap);
					break;
				}
				
				return true;
			}
		});
		



7 使用mediaplayer播放音频文件
  [1]作用:这个类用于播放音频或者是视频
  

8 百度音乐盒完成
  [1]获取当前歌曲进度和总时长
  
  [2]在服务中添加一个播放进度的方法   
  

   [3]通过handler 把数据传递到mainActivity
   [4]seekbar处理数据
   


9 mediaplayer的生命周期

10 surfaceview介绍
   [1]surfaceview 控件是一个重量级控件  
   [2]内部维护了2个线程 
   A 获取数据  负责显示 
   B 负责显示  获取数据  
   [3]他可以直接在子线程更新ui   与进度相关的控件可以直接在子线程更新ui
  
   
  
  
	super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//找到控件 
		final SurfaceView sfv = (SurfaceView) findViewById(R.id.sfv);
			
			
			final SurfaceHolder surfaceHolder = sfv.getHolder();
			
			//添加一个callback
			surfaceHolder.addCallback(new Callback() {
				//当surfaceview销毁的时候调用
				@Override
				public void surfaceDestroyed(SurfaceHolder holder) {
					System.out.println("surfaceDestroyed");
					if (player!=null && player.isPlaying()) {
						
						//获取当前视频播放的位置
						
						currentPosition = player.getCurrentPosition();
						player.stop(); 
						
					}
					
				}
				
				//当surfaceview 初始化了
				@Override
				public void surfaceCreated(SurfaceHolder holder) {
					//[1]初始化mediaplayer 
					  player = new MediaPlayer();
					
					//[2]设置要播放的资源  path 可以是本地也可是网络路径 
					try {
						player.setDataSource("http://192.168.13.89:8080/cc.MP4");
						
						//[2.1]设置播放视频的内容 SurfaceHolder  是用来维护视频播放的内容
						player.setDisplay(surfaceHolder);
						
						//[3]准备播放 
//						player.prepare();
						player.prepareAsync(); 
						//设置一个准备完成的监听
						player.setOnPreparedListener(new OnPreparedListener() {
							
							@Override
							public void onPrepared(MediaPlayer mp) {
								//[4]开始播放 
								player.start();
								//[5]继续上次的位置继续播放 
								player.seekTo(currentPosition);
								
							}
						});
						
						
						
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
				
				@Override
				public void surfaceChanged(SurfaceHolder holder, int format, int width,
						int height) {
					
				}
			});
			
			
			
			
		
		
		
		
	



补充1 VideoView
  [1]这个控件就是对surfaceview 和 meidiaplayer进行封装
  [2]meidiaplayer 播放视频他只支持 3gp MP4格式 

补充2 vitamio框架
  meidiaplayer 
  videoview 
  ffmpeg 是由好几十个C大神写的 
  不重复造轮子   谷歌
  多线程断点下载   
  xutils  360手机助手 腾讯助手
   
  
 
11照相和录像
  三星 小米 华为 .... 
  深圳 华强北 
代码如下

  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值