android基础之六——多媒体编程

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) {

        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();
}
}

你可能感兴趣的:(android-basic)