本篇介绍Android中的多媒体,主要包括图形处理的一些方法,播放音频,播放视频三部分,下面来具体看一下。
一、图形处理
缩小图片
首先来看一个放大缩小图片的例子。当我们有一张大图片想在手机里展示,但是手机的分辨率不够时就需要将图片缩小。那么如何将图片缩小呢?基本的思路就是分别获取手机的宽高、图片的宽高,然后用图片的宽高除以手机的宽高获得缩放比,根据缩放比展示图片。以下是具体的实现:
private ImageView iv;
private int screenWidth;
private int screenHeight;
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//[1]找到iv 显示加载图片
iv = (ImageView) findViewById(R.id.iv);
//[2]获取手机的分辨率 获取windowmanager 实例
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
screenWidth = wm.getDefaultDisplay().getWidth();
screenHeight = wm.getDefaultDisplay().getHeight();
System.out.println("手机的宽和高:"+screenWidth+"---"+screenHeight);
}
//点击按钮 加载dog.jpg 这张图片
@SuppressLint("SdCardPath")
public void click(View v) {
//[2]把dog.jpg 转换成bitmap
//创建bitmap工厂的配置参数
BitmapFactory.Options options = new Options();
//返回一个null 没有bitmap 不去真正解析位图 但是能返回图片的一些信息(宽和高)
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile("/mnt/sdcard/dog.jpg",options);
//[3]获取图片的宽和高
int imgWidth = options.outWidth;
int imgHeight = options.outHeight;
System.out.println("图片的宽:"+imgWidth+"-----"+imgHeight);
//[4]计算缩放比
int scale = 1; //我们定义的缩放比
int scalex = imgWidth/screenWidth;
int scaley = imgHeight /screenHeight;
if (scalex >=scaley&&scalex > scale) {
scale = scalex;
}
if (scaley > scalex && scaley>scale) {
scale = scaley;
}
System.out.println("缩放比为:"+scale);
//[5]按照缩放比显示图片
options.inSampleSize = scale;
//[6]开始真正的解析位图
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/dog.jpg",options);
//[7]把bitmap显示到控件上
iv.setImageBitmap(bitmap);
}
原图拷贝
首先为什么需要对图片进行拷贝呢?因为在Android中,不能对原图进行一些诸如旋转、缩放、位移的操作,只能对拷贝的图片进行操作,所以我们要对原图进行拷贝。下面是进行图片拷贝的代码:
ImageView iv_src = (ImageView) findViewById(R.id.iv_src);//获取原图控件
ImageView iv_copy = (ImageView) findViewById(R.id.iv_copy);//获取放拷贝图的控件
Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.mount);
iv_src.setImageBitmap(srcBitmap);
//拷贝原图
//1、创建模板
Bitmap copyBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());
//2、创建一个画布
Canvas canvas = new Canvas(copyBitmap);
//3、创建一个画笔
Paint paint = new Paint();
//4、开始作画
canvas.drawBitmap(srcBitmap,new Matrix(),paint);
//5、把copybitmap显示到iv_copy上
iv_copy.setImageBitmap(copybitmap);
图形操作的API
1、旋转
matrix.setRotate(degrees, srcBitmap.getWidth()/2, srcBitmap.getHeight()/2);
参数分别是要旋转的角度和要围绕哪个点旋转(该点的x,y坐标)
2、缩放
matrix.setScale(0.5f, 0.5f);
参数分别为x,y轴缩放的倍数
3、位移
matrix.setTranslate(20, 0);
参数分别为沿x,y轴移动的距离
4、镜面效果
matrix.setScale(1.0f, -1.0f);//
//post是在上一次修改的基础上进行修改 set每次每次都是新的变化 会覆盖上一次修改
matrix.postTranslate(0, srcBitmap.getHeight());
5、倒影效果
matrix.setScale(-1.0f, 1.0f);
matrix.postTranslate(srcBitmap.getWidth(), 0);
二、播放音频
Android中使用MediaPlayer这个类可以实现播放音频和视频的功能。
MediaPlayer的工作流程如下:
1,首先创建MediaPlaer对象; *
2,然后调用setDataSource()方法来设置音频文件的路径;**
3,再调用prepare()方法使MediaPlayer进入到准备状态;
4,调用start方法就可以播放音频。
MediaPlayer的生命周期:
使用MediaPlayer播放音频的代码如下:
//[1]初始化mediaplayer
final MediaPlayer player = new MediaPlayer();
//[2]设置要播放的资源
try {
player.setDataSource("...");//在这里设置资源的地址 可以是本地也可是网络路径
//[3]准备播放
// player.prepare();
player.prepareAsync();
//设置一个准备完成的监听
player.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
//[4]开始播放
player.start();
}
});
} catch (Exception e) {
e.printStackTrace();
}
三、播放视频
使用MediaPlayer播放视频与播放音频大体相似,但是有一点区别就是播放视频需要一个控件用来放置视频(播放音频不需要),这个控件就是SurfaceView。这是一个重量级的控件,可以在子线程中更新UI,内部维护了两个线程,一个用来获取数据,另一个用来显示。下面看代码:
private MediaPlayer player;
private int currentPosition; //当前视频播放的位置
@Override
protected void onCreate(Bundle savedInstanceState) {
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("...");//设置资源路径
//[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) {
}
});
}
布局文件代码
<SurfaceView
android:id="@+id/sfv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
播放视频还可以使用VideoView控件,这个控件对SurfaceView和MediaPlayer进行了封装,开发更为简便,但缺点是只支持3gp,MP4格式,适用范围受限。