当前位置: 代码迷 >> Android >> Android基础-十
  详细解决方案

Android基础-十

热度:29   发布时间:2016-04-28 01:43:31.0
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);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);    Toast.makeText(this, "录像完成", 0).show();}
  相关解决方案