Android基础-10 多媒体编程
图片、音乐、视频等; 多媒体:多种综合;
01_计算机表示图形的形式
.jpg 36.4 KB 255*340像素,位深度24. jpg这种工业图形的压缩算法,类似rar,把人言无法识别的颜色值压缩掉了,会使用相邻空间内的颜色表示同一种颜色。文件体积变小,失真。.png 203 KB 255*340像素,位深度32. png这种工业图形的压缩算法,使用类似map的数据结构来存储图形的数据。图片体积变小,不会失真。.bmp 255 KB 255*340像素,位深度24. 计算机在表示图形的时候使用像素点来表示,每个像素点都是使用一个颜色来表示,每个颜色都是6个十六进制的数值来表示的,每个颜色都是使用24bit来表示; 255*340*24+文件头信息占用的大小;
02_加载大图片的OOM异常
java.lang.OutOfMemoryError:内存溢出、内存泄露。ARGB 23.6m堆内存空间主要是给类实例、数组分配空间。当图片占用的空间大于对内存空间时就会抛出内存溢出的异常。
03_缩放图片并加载到内存中
缩放加载图片:
1、得到设备屏幕的分辨率:2、得到原图的分辨率:3、通过比较得到一个合适的比例值:4、使用比例值缩放一张图片,并加载到内存中:
代码:
// 1、得到设备屏幕的分辨率: WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); //Display显示器 Display display = wm.getDefaultDisplay(); long screenHeigth = display.getHeight(); long screenWidth = display.getWidth();// 2、得到原图的分辨率:Options选项 Options opts = new Options(); //如果置为true,表示只绑定图片的大小 opts.inJustDecodeBounds = true; BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/1.jpg", opts); long scrHeight = opts.outHeight; long scrWidth = opts.outWidth;// 3、通过比较得到一个合适的比例值: int scale = 1; //3000/320 = 9 3000/480=6 int sx = (int) (scrWidth/screenWidth); int sy = (int) (scrHeight/screenHeigth); if(sx>=sy&& sx>=1){ scale = sx; } if(sy>sx&& sy>=1){ scale = sy; }// 4、使用比例值缩放一张图片,并加载到内存中: opts.inJustDecodeBounds = false; //按照比例缩放原图 opts.inSampleSize = scale; Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/1.jpg", opts);
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 canvas = new Canvas(copyPic);// 4、创建一支画笔 Paint paint = new Paint(); //给画笔设置默认的颜色,在画画的过程中会使用原图的颜色来画画 paint.setColor(Color.BLACK);// 5、使用画笔在画板上画画 //参看原图画画 //srcPic 原图 //matrix 表示图形的矩阵对象 //paint 画画时使用的画笔 canvas.drawBitmap(srcPic, new Matrix(), paint);
05_计算机图形处理的原理
计算机在表示图形的时候使用像素点来表示,每个像素点都是使用一个颜色来表示,每个颜色都是6个十六进制的数值来表示的,计算机在底层表示图形时就是使用01001字符串来表示的,处理图形时就是修改0101的序列。
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 trans(View view) { // 1、得到原图 // 加载资源目录中的一个图片 Bitmap srcPic = BitmapFactory.decodeResource(getResources(), R.drawable.meinv); // 2、参考原图创建一张空白的纸张 Bitmap copyPic = Bitmap.createBitmap(srcPic.getWidth() + 200, srcPic.getHeight() + 200, srcPic.getConfig()); // 3、参考空白纸张创建一个画板 Canvas canvas = new Canvas(copyPic); // 4、创建一支画笔 Paint paint = new Paint(); // 给画笔设置默认的颜色,在画画的过程中会使用原图的颜色来画画 paint.setColor(Color.BLACK); // 处理图形 Matrix matrix = new Matrix(); // 平移图片 matrix.setTranslate(200, 200); // 5、使用画笔在画板上画画 // 参看原图画画 // srcPic 原图 // matrix 表示图形的矩阵对象,封装了处理图形的api // 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); // 处理图形 Matrix matrix = new Matrix(); // 缩放图片 // matrix.setScale(0.5f, 0.5f); matrix.setScale(0.5f, 0.5f, srcPic.getWidth() / 2, srcPic.getHeight() / 2); // 5、使用画笔在画板上画画 // 参看原图画画 // srcPic 原图 // matrix 表示图形的矩阵对象,封装了处理图形的api // paint 画画时使用的画笔 canvas.drawBitmap(srcPic, matrix, paint); iv.setImageBitmap(copyPic); } 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); // 处理图形 Matrix matrix = new Matrix(); // 旋转图片 matrix.setRotate(90); //可以让平移后的效果立即显现出来 matrix.postTranslate(srcPic.getHeight(), 0); // 5、使用画笔在画板上画画 // 参看原图画画 // srcPic 原图 // matrix 表示图形的矩阵对象,封装了处理图形的api // 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); // 处理图形 Matrix matrix = new Matrix(); // 缩放图片 // 把x方向的数据编程负值 matrix.setScale(-1.0f,1.0f); matrix.postTranslate(srcPic.getWidth(), 0); // 5、使用画笔在画板上画画 // 参看原图画画 // srcPic 原图 // matrix 表示图形的矩阵对象,封装了处理图形的api // 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); // 处理图形 Matrix matrix = new Matrix(); // 缩放图片 // 把x方向的数据编程负值 matrix.setScale(1.0f,-1.0f); matrix.postTranslate(0, srcPic.getHeight()); // 5、使用画笔在画板上画画 // 参看原图画画 // srcPic 原图 // matrix 表示图形的矩阵对象,封装了处理图形的api // paint 画画时使用的画笔 canvas.drawBitmap(srcPic, matrix, paint); iv.setImageBitmap(copyPic); }}
07_撕衣服
实现的原理:
使用两个imageview显示两张图片了,这两个imageview是重叠显示的,显示在上面的imageview显示的是穿衣服的图片,显示在下面的imageview显示的没穿衣服的图片。当手在上面的图片上移动的过程中,在移动的过程中会把手所到之处的像素点改成透明色。
代码:
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); srcPic = BitmapFactory.decodeResource(getResources(), R.drawable.pre7); copyPic = Bitmap.createBitmap(srcPic.getWidth(), srcPic.getHeight(), srcPic.getConfig()); canvas = new Canvas(copyPic); paint = new Paint(); // 给画笔设置默认的颜色,在画画的过程中会使用原图的颜色来画画 paint.setColor(Color.BLACK); // 处理图形 Matrix matrix = new Matrix(); // 5、使用画笔在画板上画画 // 参看原图画画 // srcPic 原图 // matrix 表示图形的矩阵对象,封装了处理图形的api // 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: // 按下的事件类型 break; case MotionEvent.ACTION_MOVE: // 移动的事件类型 int newX = (int) event.getX(); int newY = (int) event.getY(); System.out.println("x="+newX+"; y="+newY); for(int i=-10;i<10; i++){ for(int j=-10;j<10;j++){ if(Math.sqrt(i*i+j*j) <= 10){ //把当前像素点改成透明色 像素 Pixe transparent 透明的;清澈的;易识破的;显而易见的 copyPic.setPixel(newX + i, newY + j, Color.TRANSPARENT); iv.setImageBitmap(copyPic); } } } break; case MotionEvent.ACTION_UP: // 离开的事件类型 break; default: 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;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); srcPic = BitmapFactory.decodeResource(getResources(), R.drawable.bg); copyPic = Bitmap.createBitmap(srcPic.getWidth(), srcPic.getHeight(), srcPic.getConfig()); canvas = new Canvas(copyPic); paint = new Paint(); // 给画笔设置默认的颜色,在画画的过程中会使用原图的颜色来画画 paint.setColor(Color.BLACK); // 处理图形 Matrix matrix = new Matrix(); // 5、使用画笔在画板上画画 // 参看原图画画 // srcPic 原图 // matrix 表示图形的矩阵对象,封装了处理图形的api // paint 画画时使用的画笔 canvas.drawBitmap(srcPic, matrix, paint); iv.setImageBitmap(copyPic); // canvas.drawLine(0, 0, 200, 200, paint); 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; case MotionEvent.ACTION_UP:// 移动的事件类型 break; } return true; } }); } public void save(View view){ try { FileOutputStream fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory()+"/paiter.jpg")); boolean flag = copyPic.compress(CompressFormat.JPEG, 100, fos); if(flag){ System.out.println("保存成功................."); } } catch (Exception e) { e.printStackTrace(); } } public void red(View view){ paint.setColor(Color.RED); } public void green(View view){ paint.setColor(Color.GREEN); } public void blue(View view){ paint.setColor(Color.BLUE); } public void brush(View view){ //改变刷子的宽度 paint.setStrokeWidth(10); }}
09_视频播放器videoview(重点)
代码:
//得到视频播放器Video 磁带录像;录像磁带vv = (VideoView) findViewById(R.id.vv);//指定播放的视频资源vv.setVideoPath("http://192.168.1.254:8080/11.mp4");//开始播放vv.start();
10_音乐播放器API
代码:
//media 媒体 player = new MediaPlayer(); //设置 audio 声音信号 player.setAudioStreamType(AudioManager.STREAM_MUSIC); //设置资源路径 player.setDataSource("http://192.168.1.254:8080/xpg.mp3"); //使用同步的方式准备一个多媒体播放器,适合播放本地的资源文件 //player.prepare(); //使用异步的方式准备一个多媒体播放器,适合播放网络上的资源文件 player.prepareAsync(); player.setOnPreparedListener(new OnPreparedListener() { /* *多媒体对象准备完成时调用这个方法 */ @Override public void onPrepared(MediaPlayer mp) { player.start(); } });
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 player; private int currentPosition; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void play(View view){ try { player = new MediaPlayer(); player.setAudioStreamType(AudioManager.STREAM_MUSIC); player.setDataSource("http://192.168.1.254:8080/xpg.mp3"); //使用同步的方式准备一个多媒体播放器,适合播放本地的资源文件// player.prepare(); //使用异步的方式准备一个多媒体播放器,适合播放网络上的资源文件 player.prepareAsync(); player.setOnPreparedListener(new OnPreparedListener() { /* *多媒体对象准备完成时调用这个方法 */ @Override public void onPrepared(MediaPlayer mp) { player.start(); } }); } catch (Exception e) { e.printStackTrace(); } } public void pause(View view){ if(player != null && player.isPlaying()){ //暂停 player.pause(); currentPosition = player.getCurrentPosition(); } } public void resume(View view){ if(player != null){ //从指定的位置开始播放 player.seekTo(currentPosition); player.start(); } } public void restart(View view){ if(player != null){ //从指定的位置开始播放 player.seekTo(0); player.start(); }else{ play(view); } } public void stop(View view){ if(player != null){ //从指定的位置开始播放 player.stop(); player.release(); player = null; } }}
12_影音播放器的生命周期函数
状态:
1、空闲:调用reset方法、new MediaPlayer();2、初始化:调用setDataSource();3、准备:prepare()、prepareAsync();4、开始:start();5、完成:播放完成;
生命周期的方法:
start():开始播放;pause:暂停;resume:继续播放;seekTo():从指定的位置开始播放;stop:停止;reset:重置;release():释放多媒体对象;
13_照相机拍照(重点)
代码:
package com.itheima.camera;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){ //创建拍照的意图对象 image . 影像;肖像;概念,意向;镜像,映像 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //指定照片的存储位置 Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/123456.jpg")); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); //开启手机自带的拍照功能 startActivityForResult(intent, 0); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Toast.makeText(this, "拍照成功", 0).show(); }}
14_录像机应用
代码:
public void takeVideo(View view){ //创建拍照的意图对象 Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); //指定照片的存储位置 Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/123456.3gp")); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); //开启手机自带的拍照功能 startActivityForResult(intent, 0);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Toast.makeText(this, "录像完成", 0).show();}