安卓小案例收集四(多媒体)

Posted guanhang89

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓小案例收集四(多媒体)相关的知识,希望对你有一定的参考价值。

加载大图片

 @Override
 protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
  }


  public void click(View v){
    Options opts = new Options();
    //只请求图片宽高,不解析图片像素
    opts.inJustDecodeBounds = true;
    //返回null,获取图片宽高,保存在opts对象中
    BitmapFactory.decodeFile("sdcard/dog.jpg", opts);
    //获取图片宽高
    int imageWidth = opts.outWidth;
    int imageHeight = opts.outHeight;

    //获取屏幕宽高
    Display dp = getWindowManager().getDefaultDisplay();
int screenWidth = dp.getWidth();
    int screenHeight = dp.getHeight();

    //计算缩放比例
    int scale = 1;
    int scaleWidth = imageWidth / screenWidth;
    int scaleHeight = imageHeight / screenHeight;

    //判断取哪个比例
    if(scaleWidth >= scaleHeight && scaleWidth > 1){
        scale = scaleWidth;
    }
    else if(scaleWidth < scaleHeight && scaleHeight > 1){
        scale = scaleHeight;
    }

    //设置缩小比例
    opts.inSampleSize = scale;
    opts.inJustDecodeBounds = false;
    //获取缩小后的图片的像素信息
    Bitmap bm = BitmapFactory.decodeFile("sdcard/dog.jpg", opts);

    ImageView iv = (ImageView) findViewById(R.id.iv);
    iv.setImageBitmap(bm);

  }

创建图片副本

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //加载原图
    Bitmap bmSrc = BitmapFactory.decodeResource(getResources(), R.drawable.photo3);

    //创建副本
    //1.创建与原图一模一样大小的bitmap对象,该对象中目前是没有内容的,可以比喻为创建了和原图一样大小的白纸
    Bitmap bmCopy = Bitmap.createBitmap(bmSrc.getWidth(), bmSrc.getHeight(), bmSrc.getConfig());
    //2.创建画笔对象
    Paint paint = new Paint();
    //3.创建画板,把白纸铺到画板上
    Canvas canvas = new Canvas(bmCopy);
    //4.开始作画
    canvas.drawBitmap(bmSrc, new Matrix(), paint);

    ImageView iv_src = (ImageView) findViewById(R.id.iv_src);
    iv_src.setImageBitmap(bmSrc);
    ImageView iv_copy = (ImageView) findViewById(R.id.iv_copy);
    iv_copy.setImageBitmap(bmCopy);
}

简单图片特效

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //加载原图
    Bitmap bmSrc = BitmapFactory.decodeResource(getResources(), R.drawable.photo3);

    //创建副本
    //1.创建与原图一模一样大小的bitmap对象,该对象中目前是没有内容的,可以比喻为创建了和原图一样大小的白纸
    Bitmap bmCopy = Bitmap.createBitmap(bmSrc.getWidth(), bmSrc.getHeight(), bmSrc.getConfig());
    //2.创建画笔对象
    Paint paint = new Paint();
    //3.创建画板,把白纸铺到画板上
    Canvas canvas = new Canvas(bmCopy);

    Matrix mt = new Matrix();

    //平移效果,指定平移距离
//        mt.setTranslate(20, 10);
    //缩放效果,指定缩放比例
//        mt.setScale(2, 0.5f, bmCopy.getWidth() / 2, bmCopy.getHeight() / 2);
    //旋转效果
//        mt.setRotate(45, bmCopy.getWidth() / 2, bmCopy.getHeight() / 2);

    //镜面效果
//        mt.setScale(-1, 1);
//        mt.postTranslate(bmCopy.getWidth(), 0);

    //倒影效果
    mt.setScale(1, -1);
    mt.postTranslate(0, bmCopy.getHeight());

    canvas.drawBitmap(bmSrc, mt, paint);

    ImageView iv_src = (ImageView) findViewById(R.id.iv_src);
    iv_src.setImageBitmap(bmSrc);
    ImageView iv_copy = (ImageView) findViewById(R.id.iv_copy);
    iv_copy.setImageBitmap(bmCopy);
}

画板

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Bitmap bmSrc = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
    //白纸
    bmCopy = Bitmap.createBitmap(bmSrc.getWidth(), bmSrc.getHeight(), bmSrc.getConfig());
    //笔
    paint = new Paint();
    //画板
    canvas = new Canvas(bmCopy);
    //作画
    canvas.drawBitmap(bmSrc, new Matrix(), paint);

    iv = (ImageView) findViewById(R.id.iv);
    iv.setImageBitmap(bmCopy);

    iv.setOnTouchListener(new OnTouchListener() {

        //用户手指只要触摸屏幕,就会产生触摸事件
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            //判断触摸事件的类型
            switch (event.getAction()) {
            //手指触摸
            case MotionEvent.ACTION_DOWN:
                //触摸事件中会包含手指触摸的坐标
                startX = (int) event.getX();
                startY = (int) event.getY();
                break;
                //手指滑动
            case MotionEvent.ACTION_MOVE:
                int newX = (int) event.getX();
                int newY = (int) event.getY();
                //指定线的起点和终点
                canvas.drawLine(startX, startY, newX, newY, paint);
                iv.setImageBitmap(bmCopy);

                //把本此画线的终点设置为下一次画线的起点
                startX = newX;
                startY = newY;
                break;
                //手指抬起
            case MotionEvent.ACTION_UP:
                break;

            }
            //true表示告诉系统,这个触摸事件由iv处理
            //false表示不处理该触摸事件,事件往上传递
            return true;
        }
    });
}

public void red(View v){
    paint.setColor(Color.RED);
}

public void green(View v){
    paint.setColor(Color.GREEN);
}

public void brush(View v){
    //改变线条粗细
    paint.setStrokeWidth(8);
}

public void save(View v){
    File file = new File("sdcard/dazuo.png");
    FileOutputStream fos;
    try {
        fos = new FileOutputStream(file);
        //把图片压缩到本地文件
        bmCopy.compress(CompressFormat.PNG, 100, fos);
        fos.close();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    //手动发一个sd卡就绪广播
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
    intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
    sendBroadcast(intent);
}

模拟撕衣服

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //加载图片
    Bitmap bmSrc = BitmapFactory.decodeResource(getResources(), R.drawable.big2);
    final Bitmap bmCopy = Bitmap.createBitmap(bmSrc.getWidth(), bmSrc.getHeight(), bmSrc.getConfig());
    Paint paint = new Paint();
    Canvas canvas = new Canvas(bmCopy);
    canvas.drawBitmap(bmSrc, new Matrix(), paint);

    final ImageView iv = (ImageView) findViewById(R.id.iv);
    iv.setImageBitmap(bmCopy);

    iv.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_MOVE:
                int x = (int) event.getX();
                int y = (int) event.getY();

                //把该坐标对应的像素,置为透明色
                for (int i = -5; i < 5; i++) {
                    for (int j = -5; j < 5; j++) {
                        if(Math.sqrt(i*i + j*j) <= 5){
                            if(x + i < bmCopy.getWidth() && y + j < bmCopy.getHeight()
                                    && x + i >= 0 && y + j >= 0)
                            //把指定坐标的像素置为指定的颜色
                            bmCopy.setPixel(x + i, y + j, Color.TRANSPARENT);
                        }
                    }
                }
                iv.setImageBitmap(bmCopy);
                break;

            }
            return true;
        }
    });
}

视频播放

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    SurfaceView sv = (SurfaceView) findViewById(R.id.sv);
    //获取surfaceview的控制器
    final SurfaceHolder holder = sv.getHolder();


//      Thread t = new Thread(){
//          @Override
//          public void run() {
//              try {
//                  sleep(200);
//              } catch (InterruptedException e) {
//                  // TODO Auto-generated catch block
//                  e.printStackTrace();
//              }
//              runOnUiThread(new Runnable() {
//                  @Override
//                  public void run() {
//                      MediaPlayer player = new MediaPlayer();
//                      player.reset();
//                      try {
//                          player.setDataSource("sdcard/2.3gp");
//                          //指定视频播放在哪个surfaceview
//                          player.setDisplay(holder);
//                          player.prepare();
//                          player.start();
//                      } catch (Exception e) {
//                          // TODO Auto-generated catch block
//                          e.printStackTrace();
//                      }
//                  }
//              });
//          }
//      };
//      t.start();

    holder.addCallback(new Callback() {
        //surfaceview销毁时会调用
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            if(player != null){
                //停止之前先保存播放进度
                progress = player.getCurrentPosition();
                player.stop();
                player.release();
                player = null;
            }
        }
        //surfaceview创建时会调用
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            if(player == null){
                player = new MediaPlayer();
                player.reset();
                try {
                    player.setDataSource("sdcard/2.3gp");
                    //指定视频播放在哪个surfaceview
                    player.setDisplay(holder);
                    player.prepare();
                    //跳转到上一次停止的地方继续播放
                    player.seekTo(progress);
                    player.start();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }

        //surfaceview结构改变时会调用
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            // TODO Auto-generated method stub

        }
    });
}

VideoView

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    VideoView vv = (VideoView) findViewById(R.id.vv);
    vv.setVideoPath("sdcard/2.3gp");
    vv.start();
}

照相和拍摄

public void click1(View v){
    //启动拍照的Activity
    Intent intent = new Intent();
    intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File("sdcard/haha.jpg")));
    startActivityForResult(intent, 10);
}

public void click2(View v){
    //启动拍照的Activity
    Intent intent = new Intent();
    intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File("sdcard/haha2.3gp")));
    intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);

    startActivityForResult(intent, 20);

}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 10){
        Toast.makeText(this, "拍照完毕", 0).show();
    }
    else if(requestCode == 20){
        Toast.makeText(this, "摄像完毕", 0).show();
    }
}

拍照预览

public class MainActivity extends Activity {

     private Camera mCamera;
        private CameraPreview mPreview;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            if(checkCameraHardware(this)){
                // 创建摄像头实例
                mCamera = getCameraInstance();
            }
            else{
                return;
            }
            //创建预览类的对象
            mPreview = new CameraPreview(this, mCamera);
            FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
            //把预览类设置为帧布局的子节点
            preview.addView(mPreview);


         // 给按钮设置点击侦听
            Button captureButton = (Button) findViewById(R.id.button_capture);
            captureButton.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //自动聚焦
                        mCamera.autoFocus(new AutoFocusCallback() {

                            //聚焦完成调用
                            @Override
                            public void onAutoFocus(boolean success, Camera camera) {
                                 // 拍照
                                mCamera.takePicture(null, null, mPicture);

                            }
                        });

                    }
                }
            );
        }


    /** 检测手机是否有摄像头 */
    private boolean checkCameraHardware(Context context) {
        //检测手机是否安装有摄像头应用
        if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
            // this device has a camera
            return true;
        } else {
            // no camera on this device
            return false;
        }
    }

    /** 一个获取摄像头实例的安全途径 */
    public static Camera getCameraInstance(){
        Camera c = null;
        try {
            c = Camera.open(); // 获取第一个后置摄像头的实例
        }
        catch (Exception e){
            // Camera is not available (in use or does not exist)
        }
        return c; // returns null if camera is unavailable
    }


    private PictureCallback mPicture = new PictureCallback() {

        //拍照会调用此方法
        //data:照片的字节数组
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            try {
                File pictureFile = new File("sdcard/mrplus.jpg");
                FileOutputStream fos = new FileOutputStream(pictureFile);
                fos.write(data);
                fos.close();
            } catch (FileNotFoundException e) {
                Log.d(CameraPreview.TAG, "File not found: " + e.getMessage());
            } catch (IOException e) {
                Log.d(CameraPreview.TAG, "Error accessing file: " + e.getMessage());
            } finally{
                //拍照完成后重新进入预览
                camera.startPreview();
            }
        }
    };

}

预览类:

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    public static final String TAG = "camera";
    private SurfaceHolder mHolder;
    private Camera mCamera;

    public CameraPreview(Context context, Camera camera) {
        super(context);
        mCamera = camera;

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        //获取surfaceview的控制器
        mHolder = getHolder();
        //设置侦听
        mHolder.addCallback(this);
        // deprecated setting, but required on android versions prior to 3.0
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        // The Surface has been created, now tell the camera where to draw the preview.
        try {
            //设置摄像头的预览界面显示在holder对应的那个surfaceview
            mCamera.setPreviewDisplay(holder);
            //开始预览
            mCamera.startPreview();
        } catch (IOException e) {
            Log.d(TAG, "Error setting camera preview: " + e.getMessage());
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // empty. Take care of releasing the Camera preview in your activity.
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // If your preview can change or rotate, take care of those events here.
        // Make sure to stop the preview before resizing or reformatting it.

        if (mHolder.getSurface() == null){
          // preview surface does not exist
          return;
        }

        // 在对surfaceview做改变前,先停止预览
        try {
            mCamera.stopPreview();
        } catch (Exception e){
          // ignore: tried to stop a non-existent preview
        }

        // set preview size and make any resize, rotate or
        // reformatting changes here

        // 设置改变完后,重新开始预览
        try {
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();

        } catch (Exception e){
            Log.d(TAG, "Error starting camera preview: " + e.getMessage());
        }
    }
}

以上是关于安卓小案例收集四(多媒体)的主要内容,如果未能解决你的问题,请参考以下文章

安卓小案例收集三

安卓小案例收集五(内容提供者动画)

react-小案例,收集表单数据

小程序里echarts画的饼图在安卓手机上效果不正常?

JavaEE安卓Web前端微信小程序等接近四百篇基于代码实战的技术文章

安卓案例:用户登录