本篇介绍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的生命周期:

android thumbnails 缩略图 android缩小图片_缩放

使用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格式,适用范围受限。