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

bmp:以高质量保存,用于计算机

jpg:以良好的质量保存,用于计算机和网络

png:以高质量保存

bmp格式图片大小的计算方式:图片的总像素*每个像素的大小

【1】单色:每个像素最多可以表示2种颜色,要么是黑,要么是白,那么只需要使用长度为1的二进制位来表示,那么一个像素占1/8个byte

【2】16色:每个像素最多可以表示16种颜色,0000-1111,那么只需要使用长度为4的二进制位表示,那么一个像素占4/8 = 1/2个byte

【3】256色:每个像素最多可以表示256种颜色,00000000-11111111,那么只需要使用长度为8的二进制位来表示,那么一个像素占1个byte

【4】24位:每个像素最多可以表示1600多万中颜色,RGB的组合,那么一个像素占用3个byte,R:占1个byte  G:占1个byte  B:占1个byte

Android中采用的是png格式,Android中采用ARGB格式,其中A代表透明度,Android中一个像素占4个byte

2 缩放加载大图片

09-11 21:20:22.080:I/dalvikvm-heap(2041):Forcing collection of SoftReferences for 30720012-byte allocation(申请这么大的空间,与图片实际大小没多大关系,与图片的像素有关系)

【1】获取图片分辨率  3120*4160

【2】获取手机分辨率  320*480

【3】计算缩放比  (宽除以宽,高除以高)  宽的缩放比为9.75,高的缩放比为8.667   (一般小数点后面的省略)

所以  宽:9    宽正好

高:8    高正好

实现步骤:

【1】获取手机分辨率

//[1]获取手机的分辨率 windowmanager smsManager TelephyManagerWindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);//过时的方法获取分辨率int height = wm.getDefaultDisplay().getHeight();//获取高int width = wm.getDefaultDisplay().getWidth();//获取宽System.out.println("width:"+width+"-----"+height);//新的方法获取分辨率
//        Point point = new Point();
//        wm.getDefaultDisplay().getSize(point);
//        int width = point.x;
//        int height = point.y;
//        System.out.println("width:"+width+"-----"+height);

【2】获取图片分辨率

        //创建一个位图工厂的配置参数BitmapFactory.Options options = new Options();//解码器不会真正解析位图,但是还能够提取图片的宽和高信息options.inJustDecodeBounds = true;//有时候会因为你图片太大而报错:AndroidRuntime(2041):Cause by:java.lang.OutOfMemoryErrorBitmapFactory.decodeFile("/mnt/sdcard/picture.jpg",options);//[2]获取图片的宽和高信息int imgWidth = options.outWidth;int imgHeight = options.outHeight;System.out.println("imgWidth:"+imgWidth+"----"+imgHeight);

【3】计算缩放比

//[3]计算缩放比int scale = 1;int scaleX = imgWidth/width;int scaleY = imgHeight/height;if (scaleX > scaleY && scaleX > scale) {scale = scaleX;}if (scaleY > scaleX && scaleY > scale) {scale = scaleY;}System.out.println("缩放比:"+scale);

【4】按照缩放比进行显示

        //[4]按照缩放比进行显示options.inSampleSize = scale;//[5]按照缩放比进行解析位图options.inJustDecodeBounds = false;Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/picture.jpg",options);//[6]把bitmap显示到iv上    iv.setImageBitmap(bitmap);

注意:[1]真实手机是改不了 dvm 分配的内存大小

[2]缩放加载大图片,就是加载分辨率特别大的图片

3 创建原图的副本

为什么要创建原图的副本?因为原图不可以修改!

        //显示原图ImageView iv_src = (ImageView) findViewById(R.id.iv_src);//显示副本ImageView iv_copy = (ImageView) findViewById(R.id.iv_copy);//[1]先把tomcat.png图片转换成bitmap 显示到iv_srcBitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.tomcat);//[1.1]操作图片//srcBitmap.setPixel(20, 30, Color.RED);iv_src.setImageBitmap(srcBitmap);//[2]创建原图的副本//[2.1]创建一个模板 相当于创建了一个大小和原图一样的空白白纸Bitmap copyBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());//[2.2]想作画 需要画笔Paint paint = new Paint();//[2.3]创建一个画布 把白纸铺到画布上Canvas canvas = new Canvas(copyBitmap);//[2.4]开始作画canvas.drawBitmap(srcBitmap, new Matrix(), paint);//[2.5]操作画出来的小猫照片for (int i = 0; i < 20; i++) {copyBitmap.setPixel(20+i, 30, Color.RED);}0//[3]把copybitmap显示到iv_copy上iv_copy.setImageBitmap(copyBitmap);}

4 图形处理的API

旋转:

matrix.setRotate(20, srcBitmap.getWidth()/2, srcBitmap.getHeight()/2);

缩放:

matrix.setScale(0.5f, 0.5f);

平移:

matrix.setTranslate(30, 0);

镜面:

就是使用缩放和平移的一个组合

        matrix.setScale(-1.0f, 1);//postTranslate方法是上一次修改的基础上进行再次修改 setTranslate方法每次操作都是最新的,会覆盖上次的操作matrix.postTranslate(srcBitmap.getWidth(), 0);

倒影:

        matrix.setScale(1.0f, -1.0f);matrix.postTranslate(0, srcBitmap.getHeight());

5 画画板小案例

也要先创建原图的副本,然后给iv设置一个触摸事件

 iv.setOnTouchListener(new OnTouchListener() {int startX = 0;int startY = 0;@Overridepublic boolean onTouch(View view, MotionEvent event) {//获取当前事件的类型int action = event.getAction();switch (action) {case MotionEvent.ACTION_DOWN://按下System.out.println("按下");//获取开始位置(划线)startX = (int) event.getX();startY = (int) event.getY();break;case MotionEvent.ACTION_MOVE://移动System.out.println("移动");//获取结束位置int stopX = (int) event.getX();int stopY = (int) event.getY();//不停的划线canvas.drawLine(startX, startY, stopX, stopY, paint);//再次显示到IV上iv.setImageBitmap(copyBitmap);//更新一下开始坐标和结束坐标startX = stopX;startY = stopY;break;case MotionEvent.ACTION_UP://抬起System.out.println("抬起");break;}//True if the listener has consumes the event,false otherwisereturn true;//true:监听器处理完事件了}});

可以设置一个按钮,将画保存起来

public void click3(View v){/** format:格式  保存图片的格式* quality:保存图片的质量* SystemClock.uptimeMillis():当前手机的开机时间* */try {File file = new File(Environment.getExternalStorageDirectory().getPath(),SystemClock.uptimeMillis()+".png");FileOutputStream fos = new FileOutputStream(file);copyBitmap.compress(CompressFormat.PNG, 100, fos);//发送一条广播 欺骗系统图库的应用Intent intent = new Intent();//设置actionintent.setAction(Intent.ACTION_MEDIA_MOUNTED);intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));sendBroadcast(intent);} catch (Exception e) {e.printStackTrace();}  }

6 使用MediaPlayer播放音频文件

//点击按钮 播放一个音频文件public void click(View v){//[1]初始化MediaPlayerMediaPlayer mediaPlayer = new MediaPlayer();//[2]设置要播放的资源位置 path可以是网络资源 也可以是本地资源try {mediaPlayer.setDataSource("/mnt/sdcard/xpg.mp3");//[3]准备播放mediaPlayer.prepare();//[4]开始播放mediaPlayer.start();} catch (Exception e) {e.printStackTrace();} }

7  MediaPlayer的生命周期

同步和异步

同步准备:一般播放本地音乐

异步准备:一般播放网络音乐,不用开子线程

8 SurfaceView介绍

播放视频

MediaPlayer只能播放mp4格式或者3gp格式

surfaceView它是一个重量级应用

内部维护了2个线程

A线程  加载数据   A负责显示

B线程  负责显示  B去加载数据

它可以直接在子线程中更新UI

9 VideoView控件介绍

VideoView是对SurfaceView和MediaPlayer的封装

AVI格式或者rmvb格式

布局里面:

<VideoView

android:id="@+id/vv"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

/>

//[1]找到控件VideoView vv = (VideoView) findViewById(R.id.vv);//[2]设置播放的路径vv.setVideoPath("http://192.168.177.1:8080/miss.mp4");vv.start();

10 vitamio框架

解码原理:使用的是一个开源项目

11照相机和录像机

//点击按钮 实现拍照public void click1(View v){// create Intent to take a picture and return control to the calling applicationIntent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);File file = new File(Environment.getExternalStorageDirectory().getPath(),"haha.png");intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); // 保存图片// start the image capture IntentstartActivityForResult(intent, 1);}//当开启的Activity关闭的时候调用@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {System.out.println("onActivityResult");super.onActivityResult(requestCode, resultCode, data);}//点击按钮 实现录影public void click2(View v){Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);File file = new File(Environment.getExternalStorageDirectory().getPath(),"hehe.mp4");intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); // 保存图片// start the image capture IntentstartActivityForResult(intent, 2);}

Android基础知识(十)之多媒体相关推荐

  1. Android基础知识(二十):Notification、提醒式通知(横幅)踩坑与通知界面设置跳转

    Android基础知识(二十):Notification.提醒式通知(横幅)踩坑与通知界面设置跳转 一.Notification通知与基本用法 通知Notification是Android系统中比较有 ...

  2. Android 基础知识+app测试权限问题

    Android 基础知识(权限篇)** 前言 ​ Android是一个开源的,基于Linux的移动设备操作系统,主要用于移动设备,如智能手机和平板电脑.Android是由谷歌及其他公司带领的开放手机联 ...

  3. Android基础知识——完善

    首页 下载App × Android基础知识--完善 布鲁马 2016.05.17 10:29* 字数 5478 阅读 2672评论 1喜欢 38 疯狂Android摘要,Android基础知识好乱好 ...

  4. android基础知识

    技术型男 随笔 - 20, 文章 - 0, 评论 - 4, 引用 - 0 android基础知识 1. 前言 1.1. 什么是3G.4G Ÿ 第三代移动通信技术(3rd - Generation),速 ...

  5. Android基础知识:在UI线程中运行代码

    本文翻译自:Android basics: running code in the UI thread In the viewpoint of running code in the UI threa ...

  6. 100天精通Andriod逆向——第2天:Android基础知识和jadx的使用

    目录 一.Android基础知识介绍 1.1 Android 历史版本 1.2 apk 包文件结构 1.3 Android系统目录介绍 二.jadx的使用 2.1 jadx 的简介 2.2 jadx ...

  7. Android基础知识【项目实训-实现二级导航“今日活动”及读取数据库】【5】

    [该项目实训是Android基础知识的一个综合练习,特别提示:项目中会用到一些图片素材,都是随意整理的,稍后会上传一个资源,包含该事项项目的基本功能,也含有图片素材] [项目题目]:校园订餐App设计 ...

  8. Android基础知识(二十一):Android五大存储之文件存储、Content Provider存储和网络存储

    Android基础知识(二十一):Android五大存储之文件存储.Content Provider存储和网络存储 一.Android存储--持久化技术 数据持久化是指将那些内存中的瞬时数据保存到存储 ...

  9. Android基础知识~入门进阶,一步步走到高手

    Android基础知识~入门进阶,一步步走到高手 2011年09月01日 [b]希望新入手ANDROID设备的朋友认真阅读本帖,一些简单的问题就可以自己解决了!!! 一:基础知识[/b] [b]1.什 ...

  10. Android基础知识 - SQLite数据库的最佳实践(使用事务、升级数据库的最佳写法)

    目录 使用事务 升级数据库的最佳写法 使用事务 SQLite数据库时支持事务的,事务的特性可以保证让某一系列的操作要么全部完成,要么一个都不会完成. 那么在什么情况下才需要使用事务呢? 想象以下场景, ...

最新文章

  1. c语言加法减法乘法,一元多项式的加法减法乘法c语言描述线性表应用
  2. Linux系统mongdb还原数据库,linux下mongodb数据库备份与还原
  3. eclipse中提交git总是要求输入用户名、密码
  4. 《Android游戏开发详解》一3.1 构造方法
  5. 【数据结构与算法】之深入解析“H指数II”的求解思路与算法示例
  6. android 颜色范围,Android系统颜色的适用范围
  7. 微软 Edge 浏览器将推出 iOS 和 Android 版
  8. python做服务器需要什么模块_用Python自带的包建立简单的web服务器
  9. 高等代数---二次型
  10. Java对接微信开放平台详解
  11. linux桌面小程序开发日记_1(pyqt5 + yolov5)
  12. IB学生可以报考全球顶尖大学,需要多少分?
  13. matlab 表示希腊字母yita,数学罗马符号_常用数学的罗马符号和拉丁符号有什么哪些_淘题吧...
  14. html类选择器使用在什么场景,你需掌握的CSS知识都在这了(长文建议收藏,文末有福利)...
  15. Socket实战——Teardrop代码编程
  16. nuc9vxqnx_Intel NUC 9 Pro / Extreme(幽灵峡谷 / 石英峡谷)即将发售
  17. GMSL高带宽数据接入的方法
  18. android 4.4 batteryservice 电池电量显示分析
  19. 因为这份简历,我拿到了阿里的offer!(转载)
  20. 数据结构—回溯法、子集树、排列树

热门文章

  1. limits.conf 配置不生效问题排查
  2. UrlRewriter.NET 与 UrlRewrittingNet.UrlRewriter比较
  3. Android 插件化学习 加载apk并调用类的函数
  4. Suse12离线安装docker
  5. linux下通过SD卡烧录.bin程序
  6. linux 开放连续端口,CentOS/Linux 开放80、8080端口或者开放某个端口
  7. Vue3 到底哪里好?和React Hook对比有啥有优势?本文详解
  8. 百度富文本编辑器(ueditor)样式错误,回显出现#39、quot
  9. [7]深入浅出工作开源框架Camunda: camunda-webapp 用户登录功能代码分析
  10. redis数据类型总结