android基础之六——多媒体编程
2016-02-21 22:20
369 查看
01_计算机表示图形的形式
png:以高质量的形式保存图片,并将其应用于计算机或网络;203 KB ,255*340像素,位深度32; png是计算机图形的工业压缩算法,使用类map的一种数据结构来存储文件。文件体积变小,颜色不会失真。 jpg:以良好的质量的保存图片,并将其应用于计算机、电子邮件、或者网络;36.4 KB , 255*340像素,位深度24; jpg是计算机图形的工业压缩算法,类似RAR的算法,人眼的识别精度是有限,把人眼无法识别的像素都压缩掉了,使用相邻空间内的颜色来表示被压缩掉的颜色值。文件体积变小了,颜色也失真。 bmp:以高质量的形式保存图片,并将其应用于计算机; 255 KB,255*340像素,位深度24; 计算机使用像素点表示图形的,每个像素点都是使用一个颜色值来表示的,每个颜色值都是使用24bit来表示的; 计算公式:255*340*24 + 文件头信息占用的数据量=实际大小;
02_加载大图片的OOM异常
java.lang.OutOfMemoryError(oom):内存溢出,内存泄露; VM heap:堆内存;主要是类实例和数组分配内存空间的。 Android应用程序一启动的时候系统就会创建一个dalvik虚拟机,dalvik虚拟机上会分配一个对内存空间,默认是16m。当程序加载一张图片的大小大于堆内存空间时,就抛出内存溢出的异常。
03_缩放图片并加载到内存中
解决办法:缩放显示图片 步骤: 1、得到原图的分辨率: 2、得到设备屏幕的分辨率: 3、通过比较得到一个合适的比例值: 4、根据比例缩放原图;
代码:
package com.itheima.loadpic; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory.Options; import android.os.Bundle; import android.os.Environment; import android.view.Display; import android.view.WindowManager; import android.widget.ImageView; public class MainActivity extends Activity { private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.iv); // 1、得到原图的分辨率: Options opts = new Options(); //只返回图片的分辨率,不把图片加载到内存中 opts.inJustDecodeBounds= true; BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/1.jpg", opts); //得到原图的分辨率 int srcPicHeight = opts.outHeight; int srcPiWidth = opts.outWidth; // 2、得到设备屏幕的分辨率: WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); int screenHeight = display.getHeight(); int screenWidth = display.getWidth(); // 3、通过比较得到一个合适的比例值: //3000* 3000 320*480 //3000/320=9 int sy = srcPicHeight/screenHeight; int sx = srcPiWidth/screenWidth; int scale = 1; if(sy>=sx && sy >= 1){ scale = sy; } if(sx>=sy && sx >= 1){ scale = sx; } // 4、根据比例缩放原图; opts.inJustDecodeBounds= false; opts.inSampleSize= scale;//宽和高都是原图的1/9; Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/1.jpg", opts); iv.setImageBitmap(bm); } }
04_在内存中创建原图的副本(重点)
原因:Android应用程序不允许直接修改原图,在加载原图的时候会在内存中创建一个与原图一模一样的副本,以后在处理图形的时候修改的都是副本。如果在代码中直接修改原图,会抛出异常。 临摹画画: 1、创建一张原图: 2、参考原图创建一个空白纸张: 3、参考空白纸张创建一个画板: 4、创建一支画笔: 5、使用画笔在画板上临摹画画:
模版代码:
// 1、创建一张原图: Bitmap srcPic = BitmapFactory.decodeResource(getResources(), R.drawable.meinv); // 2、参考原图创建一个空白纸张: Bitmap copyPic = Bitmap.createBitmap(srcPic.getWidth(), srcPic.getHeight(), srcPic.getConfig()); // 3、参考空白纸张创建一个画板: Canvas canvas = new Canvas(copyPic); // 4、创建一支画笔: Paint paint = new Paint(); //给画笔设置默认的颜色,画画的时候会根据原图的颜色自动选择相应的颜色 paint.setColor(Color.BLACK); // 5、使用画笔在画板上临摹画画: //srcPic 参考的原图 //Matrix 处理图形使用的矩阵对象 //paint 使用哪个画笔来画画 canvas.drawBitmap(srcPic, new Matrix(), paint);
05_计算机图形处理的原理
计算机使用像素点表示图形的,每个像素点都是使用一个颜色值来表示的,每个颜色值都是使用24bit来表示的;计算机在底层表示图形的时候都是使用01001的字符串来存储。计算机在处理图形的时候修改的是01001字符串的序列。
06_计算机图形处理的API(重点)
旋转、平移、缩放、倒影、镜面等;
代码:
package com.itheima.copypic; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.os.Bundle; import android.view.View; import android.widget.ImageView; public class MainActivity extends Activity { private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.iv); } public void rotate(View view){ // 1、创建一张原图: Bitmap srcPic = BitmapFactory.decodeResource(getResources(), R.drawable.meinv); // 2、参考原图创建一个空白纸张: Bitmap copyPic = Bitmap.createBitmap(srcPic.getWidth(), srcPic.getHeight(), srcPic.getConfig()); // 3、参考空白纸张创建一个画板: Canvas canvas = new Canvas(copyPic); // 4、创建一支画笔: Paint paint = new Paint(); //给画笔设置默认的颜色,画画的时候会根据原图的颜色自动选择相应的颜色 paint.setColor(Color.BLACK); // 5、使用画笔在画板上临摹画画: Matrix matrix = new Matrix(); matrix.setRotate(90, 80, 80); //srcPic 参考的原图 //Matrix 处理图形使用的矩阵对象 //paint 使用哪个画笔来画画 canvas.drawBitmap(srcPic, matrix, paint); iv.setImageBitmap(copyPic); } public void trans(View view){ // 1、创建一张原图: Bitmap srcPic = BitmapFactory.decodeResource(getResources(), R.drawable.meinv); // 2、参考原图创建一个空白纸张: Bitmap copyPic = Bitmap.createBitmap(srcPic.getWidth()+100, srcPic.getHeight()+100, srcPic.getConfig()); // 3、参考空白纸张创建一个画板: Canvas canvas = new Canvas(copyPic); // 4、创建一支画笔: Paint paint = new Paint(); //给画笔设置默认的颜色,画画的时候会根据原图的颜色自动选择相应的颜色 paint.setColor(Color.BLACK); // 5、使用画笔在画板上临摹画画: Matrix matrix = new Matrix(); matrix.setTranslate(100, 100); //srcPic 参考的原图 //Matrix 处理图形使用的矩阵对象 //paint 使用哪个画笔来画画 canvas.drawBitmap(srcPic, matrix, paint); iv.setImageBitmap(copyPic); } public void scale(View view){ // 1、创建一张原图: Bitmap srcPic = BitmapFactory.decodeResource(getResources(), R.drawable.meinv); // 2、参考原图创建一个空白纸张: Bitmap copyPic = Bitmap.createBitmap(srcPic.getWidth(), srcPic.getHeight(), srcPic.getConfig()); // 3、参考空白纸张创建一个画板: Canvas canvas = new Canvas(copyPic); // 4、创建一支画笔: Paint paint = new Paint(); //给画笔设置默认的颜色,画画的时候会根据原图的颜色自动选择相应的颜色 paint.setColor(Color.BLACK); // 5、使用画笔在画板上临摹画画: Matrix matrix = new Matrix(); matrix.setScale(0.5f, 0.5f); //srcPic 参考的原图 //Matrix 处理图形使用的矩阵对象 //paint 使用哪个画笔来画画 canvas.drawBitmap(srcPic, matrix, paint); iv.setImageBitmap(copyPic); } public void jm(View view){ // 1、创建一张原图: Bitmap srcPic = BitmapFactory.decodeResource(getResources(), R.drawable.meinv); // 2、参考原图创建一个空白纸张: Bitmap copyPic = Bitmap.createBitmap(srcPic.getWidth(), srcPic.getHeight(), srcPic.getConfig()); // 3、参考空白纸张创建一个画板: Canvas canvas = new Canvas(copyPic); // 4、创建一支画笔: Paint paint = new Paint(); //给画笔设置默认的颜色,画画的时候会根据原图的颜色自动选择相应的颜色 paint.setColor(Color.BLACK); // 5、使用画笔在画板上临摹画画: Matrix matrix = new Matrix(); matrix.setScale(-1.0f, 1.0f); //可以让图片平移的效果马上显现出来 matrix.postTranslate(srcPic.getWidth(), 0); //srcPic 参考的原图 //Matrix 处理图形使用的矩阵对象 //paint 使用哪个画笔来画画 canvas.drawBitmap(srcPic, matrix, paint); iv.setImageBitmap(copyPic); } public void dy(View view){ // 1、创建一张原图: Bitmap srcPic = BitmapFactory.decodeResource(getResources(), R.drawable.meinv); // 2、参考原图创建一个空白纸张: Bitmap copyPic = Bitmap.createBitmap(srcPic.getWidth(), srcPic.getHeight(), srcPic.getConfig()); // 3、参考空白纸张创建一个画板: Canvas canvas = new Canvas(copyPic); // 4、创建一支画笔: Paint paint = new Paint(); //给画笔设置默认的颜色,画画的时候会根据原图的颜色自动选择相应的颜色 paint.setColor(Color.BLACK); // 5、使用画笔在画板上临摹画画: Matrix matrix = new Matrix(); matrix.setScale(1.0f, -1.0f); //可以让图片平移的效果马上显现出来 matrix.postTranslate(0, srcPic.getHeight()); //srcPic 参考的原图 //Matrix 处理图形使用的矩阵对象 //paint 使用哪个画笔来画画 canvas.drawBitmap(srcPic, matrix, paint); iv.setImageBitmap(copyPic); } }
07_撕衣服
代码:package com.itheima.syf; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; public class MainActivity extends Activity { private ImageView iv; private Bitmap srcPic; private Bitmap copyPic; private Canvas canvas; private Paint paint; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.iv); // 1、创建一张原图: srcPic = BitmapFactory.decodeResource(getResources(), R.drawable.pre7); // 2、参考原图创建一个空白纸张: copyPic = Bitmap.createBitmap(srcPic.getWidth(), srcPic.getHeight(), srcPic.getConfig()); // 3、参考空白纸张创建一个画板: canvas = new Canvas(copyPic); // 4、创建一支画笔: paint = new Paint(); // 给画笔设置默认的颜色,画画的时候会根据原图的颜色自动选择相应的颜色 paint.setColor(Color.BLACK); // 5、使用画笔在画板上临摹画画: Matrix matrix = new Matrix(); // srcPic 参考的原图 // Matrix 处理图形使用的矩阵对象 // paint 使用哪个画笔来画画 canvas.drawBitmap(srcPic, matrix, paint); iv.setImageBitmap(copyPic); // 添加一个触摸的监听器 iv.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN:// 按下的事件类型 int startX = (int)event.getX(); int startY = (int)event.getY(); break; case MotionEvent.ACTION_MOVE:// 移动的事件类型 //获得当前像素点的坐标 int newX = (int)event.getX(); int newY = (int)event.getY(); for(int i=-10;i<10; i++){ for(int j=-10;j<10;j++){ if(Math.sqrt(i*i+j*j) <=10){ //把当前像素点设置成透明色 copyPic.setPixel(newX+i, newY+j, Color.TRANSPARENT); } } } iv.setImageBitmap(copyPic); break; case MotionEvent.ACTION_UP:// 抬起的事件类型 break; } //设置为true表示当前事件已经结束 return true; } }); } }
08_画画板
代码:package com.itheima.painter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.os.Bundle; import android.os.Environment; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; import android.widget.Toast; public class MainActivity extends Activity { private ImageView iv; private Bitmap srcPic; private Bitmap copyPic; private Canvas canvas; private Paint paint; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.iv); // 1、创建一张原图: srcPic = BitmapFactory.decodeResource(getResources(), R.drawable.bg); // 2、参考原图创建一个空白纸张: copyPic = Bitmap.createBitmap(srcPic.getWidth(), srcPic.getHeight(), srcPic.getConfig()); // 3、参考空白纸张创建一个画板: canvas = new Canvas(copyPic); // 4、创建一支画笔: paint = new Paint(); // 给画笔设置默认的颜色,画画的时候会根据原图的颜色自动选择相应的颜色 paint.setColor(Color.BLACK); // 5、使用画笔在画板上临摹画画: Matrix matrix = new Matrix(); // srcPic 参考的原图 // Matrix 处理图形使用的矩阵对象 // paint 使用哪个画笔来画画 canvas.drawBitmap(srcPic, matrix, paint); iv.setImageBitmap(copyPic); iv.setOnTouchListener(new OnTouchListener() { private int startX; private int startY; @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: startX = (int) event.getX(); startY = (int) event.getY(); break; case MotionEvent.ACTION_MOVE: // 获得结束坐标点 int endX = (int) event.getX(); int endY = (int) event.getY(); canvas.drawLine(startX, startY, endX, endY, paint); iv.setImageBitmap(copyPic); // 获得新的开始坐标点 startX = (int) event.getX(); startY = (int) event.getY(); break; } return true; } }); } public void red(View view) { paint.setColor(Color.RED); } public void green(View view) { paint.setColor(Color.GREEN); } public void blue(View view) { c8e5 paint.setColor(Color.BLUE); } public void brush(View view) { //改变画笔的宽度 paint.setStrokeWidth(10); } public void save(View view) { try { FileOutputStream fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory()+"/bird.jpg")); copyPic.compress(CompressFormat.JPEG, 100, fos); fos.close(); Toast.makeText(this, "保存成功", 0).show(); } catch (Exception e) { e.printStackTrace(); } } }
09_视频播放器videoview(重点)
代码://初始化视频播放器 vv = (VideoView) findViewById(R.id.vv); vv.setVideoPath("http://192.168.16.78:8080/11.mp4"); vv.start();
10_音乐播放器API
代码:package com.itheima.mediaplayer; import android.app.Activity; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnPreparedListener; import android.os.Bundle; public class MainActivity extends Activity { private MediaPlayer mediaPlayer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { String url = "http://192.168.16.78:8080/xpg.mp3"; // your URL here mediaPlayer = new MediaPlayer(); //设置音频流的类型 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); //设置播放的资源文件 mediaPlayer.setDataSource(url); //准备多媒体播放器对象 // mediaPlayer.prepare(); //适合加载本地一个资源文件 mediaPlayer.prepareAsync(); //适合加载网络上一个资源文件 mediaPlayer.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mediaPlayer.start(); } }); } catch (Exception e) { e.printStackTrace(); } } }
11_影音播放器的常用API
代码:package com.itheima.mediaplayer; import android.app.Activity; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnPreparedListener; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { private MediaPlayer mediaPlayer; private int currentPosition; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void play(View view){ try { String url = "http://192.168.16.78:8080/xpg.mp3"; // your URL here mediaPlayer = new MediaPlayer(); //设置音频流的类型 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); //设置播放的资源文件 mediaPlayer.setDataSource(url); //准备多媒体播放器对象 // mediaPlayer.prepare(); //适合加载本地一个资源文件 mediaPlayer.prepareAsync(); //适合加载网络上一个资源文件 mediaPlayer.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mediaPlayer.start(); } }); } catch (Exception e) { e.printStackTrace(); } } public void pause(View view){ if(mediaPlayer != null && mediaPlayer.isPlaying()){ currentPosition = mediaPlayer.getCurrentPosition(); mediaPlayer.pause(); } } public void resume(View view){ //从指定的位置开始播放 mediaPlayer.seekTo(currentPosition); mediaPlayer.start(); } public void restart(View view){ //从指定的位置开始播放 if(mediaPlayer != null){ mediaPlayer.seekTo(0); mediaPlayer.start(); }else{ play(view); } } public void stop(View view){ if(mediaPlayer != null){ mediaPlayer.stop(); //释放多媒体播放器对象 mediaPlayer.release(); //让垃圾回收期马上回收占用的资源 mediaPlayer = null; } } }
12_影音播放器的生命周期函数
idle(空闲):new MediaPlayer()、reset(); initialized(初始化):setDataSource(); prepared(准备):prepare()、prepareAsync(); start(开始):start(); completed(完成):播放完成;
生命周期函数:
start() prepare()、prepareAsync() pause() seekTo() stop() release() reset()
13_照相机拍照(重点)
参考开发文档:package com.itheima.cameraimg; import java.io.File; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void takePhoto(View view){ //1、创建一个拍照的意图 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // create a file to save the image Uri fileUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/123.jpg")); intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name // start the image capture Intent startActivityForResult(intent, 0); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Toast.makeText(this, "拍照成功", 0).show(); } }
14_录像机应用
参考开发文档代码:
package com.itheima.cameraimg; import java.io.File; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void takeVideo(View view){ //1、创建一个录像的意图 Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); // create a file to save the image Uri fileUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/123.3gp")); intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name // start the image capture Intent startActivityForResult(intent, 0); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Toast.makeText(this, "录像完成", 0).show(); } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories