Android 基础知识10

来源:互联网 发布:js实现tab切换 编辑:程序博客网 时间:2024/06/05 06:52
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 画画板小案例
主要代码如下
  1. //[4]给iv设置一个触摸事件
  2. iv.setOnTouchListener(new OnTouchListener() {
  3. int startX = 0;
  4. int startY = 0;
  5. @Override
  6. public boolean onTouch(View v, MotionEvent event) {
  7. //[5]获取手指触摸的事件类型
  8. int action = event.getAction();
  9. //[6]具体判断一下是什么事件类型
  10. switch (action) {
  11. case MotionEvent.ACTION_DOWN: //按下
  12. //[7]获取手指按下坐标
  13. startX = (int) event.getX();
  14. startY= (int) event.getY();
  15. System.out.println("按下:"+startX+"---"+startY);
  16. break;
  17. case MotionEvent.ACTION_MOVE://移动
  18. //[8]获取停止的坐标
  19. int stopX = (int) event.getX();
  20. int stopY = (int) event.getY();
  21. System.out.println("移动:"+stopX+"---"+stopY);
  22. //[9]画线
  23. canvas.drawLine(startX, startY, stopX, stopY, paint);
  24. //[9.1]更新一下起点坐标
  25. startX = stopX;
  26. startY = stopY;
  27. //[10]记得更新ui
  28. iv.setImageBitmap(copyBitmap);
  29. break;
  30. case MotionEvent.ACTION_UP: //抬起;
  31. break;
  32. }
  33. return true;
  34. }
  35. });
  36. }


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



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

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

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


9 mediaplayer的生命周期

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


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

补充2 vitamio框架
  meidiaplayer 
  videoview 
  ffmpeg 是由好几十个C大神写的 
  不重复造轮子   谷歌
  多线程断点下载   
  xutils  
   
  
 


  


0 0
原创粉丝点击