Android基础-10

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

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    Toast.makeText(this, "录像完成", 0).show();
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。