Androidd多媒体开发基础

Android学习笔记,整理给自己复习的时候看的,谢谢!

1 计算机表示图形的几种方式

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

2 缩放加载加载大图片

04-14 00:59:51.813: E/AndroidRuntime(2128): Caused by: java.lang.OutOfMemoryError
04-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播放音频文件

这个类用于播放音频或者是视频

8 百度音乐盒案例

[1]获取当前歌曲进度和总时长
这里写图片描述

[2]在服务中添加一个播放进度的方法
这里写图片描述

*[3]通过handler把数据传递到mainActivity*
[4]seekbar处理数据
这里写图片描述

9 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) {
}
});

10 VideoView

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

11 vitamio框架

  meidiaplayer 
  videoview 
  ffmpeg 
  多线程断点下载   
  xutils  360手机助手 腾讯助手

12照相和录像

这里写图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值