Android 笔记8---图像,声音,多媒体

[1] 画笔和画布

[2] 绘制几何图形

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint();
        paint.setAntiAlias(true); //抗锯齿功能
        paint.setColor(0xFFA4C739);

        //绘制机器人的头部
        RectF rectF =new RectF(10,10,100,100);
        rectF.offset(90,20);
        canvas.drawArc(rectF,-10,-160,false,paint); //绘制弧

        //绘制眼睛
        paint.setColor(0xFFFFFFFF);
        canvas.drawCircle(165,53,4,paint);//绘制圆
        canvas.drawCircle(125,53,4,paint);

        //天线
        paint.setColor(0xFFA4C739);
        paint.setStrokeWidth(2);//笔触 的宽度
        canvas.drawLine(110,15,125,35,paint);
        canvas.drawLine(180,15,165,35,paint);

        //身体
        canvas.drawRect(100,75,190,150,paint);
        RectF rectF_body=new RectF(100,140,190,160);
        canvas.drawRoundRect(rectF_body,10,10,paint);

        //绘制胳膊
        RectF rectF_arm=new RectF(75,75,95,140);
        canvas.drawRoundRect(rectF_arm,10,10,paint);
        rectF_arm.offset(120,0);
        canvas.drawRoundRect(rectF_arm,10,10,paint);
        //绘制腿
        RectF rectF_leg=new RectF(115,150,135,200);
        canvas.drawRoundRect(rectF_leg,10,10,paint);
        rectF_leg.offset(40,0);
        canvas.drawRoundRect(rectF_leg,10,10,paint);

    }

[3]绘制文字

  protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Paint paint = new Paint();
        paint.setColor(0xFF000000);  //画笔颜色
        paint.setAntiAlias(true);  //抗锯齿
        paint.setTextAlign(Paint.Align.LEFT);
        paint.setTextSize(35);

        canvas.drawText("你在想我吗?",100,100,paint);

[4]绘制图片

  1. BitmapFactory类

grz.jpg存放位置在 /storage/emulated/0/grz.jpg

     Paint paint = new Paint();
        String state;
        String path;
        state = Environment.getExternalStorageState();
       if(state.equals(Environment.MEDIA_MOUNTED)) {
            path = Environment.getExternalStorageDirectory() + "/grz.jpg"; //获取文件路径
           //创建位图对象
           Bitmap bitmap = BitmapFactory.decodeFile(path);
           //绘制图片
            canvas.drawBitmap(bitmap,0,0,paint);
       }

必须加权限,手机中也要打开权限,如图

在这里插入图片描述
在这里插入图片描述

2.Bitmap
//通过扣取一部分绘制图片
Bitmap bitmap1 = Bitmap.createBitmap(bitmap,34.90.150,179)
canvas.drawBitmap(bitmap1,0,0,paint);

[5]绘制路径

  • 通过Path类创建路径对象: addArc(), addCircle(), addRect() , addRoundRect() ;
  • 通过Canvas类来体现: drawPath() , drawTextOnPath();
 Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(0xFF0000FF);
        paint.setStyle(Paint.Style.STROKE); //填充样式为描边
        Path path = new Path();
        path.addCircle(200,100,100,Path.Direction.CW); //创建一个圆形路径
        //canvas.drawPath(path,paint);  //绘制一个圆形
        paint.setTextSize(16);
        canvas.drawTextOnPath("活着就是为了改变世界",path,0,0,paint);

[6] 逐帧动画

  1. 在Drawable目录中创建动画文件
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/line1" android:duration="160"/>
    <item android:drawable="@drawable/line2" android:duration="160"/>
    <item android:drawable="@drawable/line3" android:duration="160"/>
    <item android:drawable="@drawable/line4" android:duration="160"/>
    <item android:drawable="@drawable/line5" android:duration="160"/>
    <item android:drawable="@drawable/line6" android:duration="160"/>
</animation-list>
  1. 布局文件中背景设为cat.xml
 android:background="@drawable/cat"

3.主程序文件中

  LinearLayout layout = findViewById(R.id.catout); //获取布局管理器
  final AnimationDrawable anim = (AnimationDrawable) layout.getBackground();      //获取动画资源
       layout.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
                if(flag){
                    anim.start();
                    flag=false;
                }else{
                    anim.stop();
                    flag=true;
                }
           }
       });

[7]补间动画

透明度(alpha),旋转(rotate),缩放(scale),平移(translate)

  1. 创建动画资源文件
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
	<alpha android:fromAlpha="0"
	    android:toAlpha="1"
	    android:duration="4000"/>
</set>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale android:fromXScale="0.0"
        android:fromYScale="0.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1.0"
        android:toYScale="1.0"
        android:duration="2000"></scale>
</set>
  1. 主程序中
Animation anim= AnimationUtils.loadAnimation(MainActivity.this,R.drawable.xxx);
button.startAnimation(anim);

[8]MediaPlayer

mp

public class MainActivity extends AppCompatActivity {

    private File file;
    private ImageButton play;
    private ImageButton stop;
    private boolean isPause=false;
    private MediaPlayer mediaPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //全屏显示
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        file = new File("/sdcard/zerobelieveme.mp3");
        if(file.exists()){
            //创建MediaPlayer对象,并且装载声音资源
            mediaPlayer = MediaPlayer.create(this, Uri.parse(file.getAbsolutePath()));

        }else{
            Toast.makeText(MainActivity.this,"要播放的文件不存在",Toast.LENGTH_SHORT).show();
        }
        play = findViewById(R.id.play);
        stop = findViewById(R.id.stop);
        play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            ///storage/emulated/0/zerobelieveme.mp3
                if(mediaPlayer.isPlaying()&&!isPause){
                    mediaPlayer.pause(); //暂停播放
                    isPause=true;
				//更换图标为播放
                    ((ImageButton)v).setImageDrawable(getResources().getDrawable(R.drawable.pause,null));

                }else{
                    mediaPlayer.start();  //开始播放
                    isPause=false;
                    ((ImageButton)v).setImageDrawable(getResources().getDrawable(R.drawable.play,null));
                }
            }
        });
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer.stop();  //停止播放
                play.setImageDrawable(getResources().getDrawable(R.drawable.play,null));
            }
        });
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                //实现重新播放
                play();
            }
        });
    }
    private void play() {
        mediaPlayer.reset();  //重置音频
        try {
            mediaPlayer.setDataSource(file.getAbsolutePath());
            mediaPlayer.prepare();  //预加载音频文件
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    protected void onDestroy() {
        if(mediaPlayer.isPlaying()){
            mediaPlayer.stop();
        }
        mediaPlayer.release();  //释放资源
        super.onDestroy();
    }
}

[9]SoundPool

SoundPool

 final ListView listView = findViewById(R.id.listview);
        //**创建soundPool对象,并且设置音频相关属性***//
        AudioAttributes attr = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_MEDIA)  //设置音效的使用场景
                .setUsage(AudioAttributes.CONTENT_TYPE_UNKNOWN) //设置音效类型
                .build();
        final SoundPool soundPool = new SoundPool.Builder()
                .setAudioAttributes(attr)   //设置音效池的属性
                .setMaxStreams(10)  //设置最多可容纳10音频流
                .build();
        /****将要播放的音频保存到HashMap对象中****/
        final HashMap<Integer,Integer> soundmap = new HashMap<Integer, Integer>();
        soundmap.put(0,soundPool.load(this,R.raw.backroad,1));
        soundmap.put(1,soundPool.load(this,R.raw.birdloop,1));
        soundmap.put(2,soundPool.load(this,R.raw.bollywood,1));
        soundmap.put(3,soundPool.load(this,R.raw.ding,1));
        soundmap.put(4,soundPool.load(this,R.raw.safari,1));
        soundmap.put(5,soundPool.load(this,R.raw.third_eye,1));
        soundmap.put(6,soundPool.load(this,R.raw.world,1));

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                soundPool.play(soundmap.get(position),1,
                        1,0,0,1);
//                Toast.makeText(MainActivity.this,"这是首歌",Toast.LENGTH_SHORT).show();
            }
        });
    }

[10]VideoView

 //FullSCreen
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        VideoView videoView = findViewById(R.id.videoview);
        //*****load*****//
        File file = new File(Environment.getExternalStorageDirectory()+"/speakman.mp4");

        if(file.exists()){
            videoView.setVideoPath(file.getAbsolutePath());
        }else{
            Toast.makeText(MainActivity.this,"File not Found",Toast.LENGTH_SHORT).show();
        }
        //*****Control video*****//
        MediaController mc = new MediaController(this);
        videoView.setMediaController(mc);
        videoView.requestFocus();
        videoView.start();
        videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                Toast.makeText(MainActivity.this,"complete",Toast.LENGTH_LONG).show();
            }
        });

    }

[11]使用surfaceview 和mediaplayer配合播放视频

public class MainActivity extends AppCompatActivity {

    private ImageButton btn_pause;
    private ImageButton btn_play;
    private ImageButton btn_stop;
    private  boolean noPlay=true;  //播放状态默认为不播放
    private SurfaceView surfaceView;
    private SurfaceHolder surfaceHolder;
    private MediaPlayer mediaPlayer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //全屏显示
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        //********************初始化surfaceview和MediaPlayer*************************//
        //获取surfaceview对象
        surfaceView = findViewById(R.id.surfaceview);
        // 获取surfaceholder
        surfaceHolder = surfaceView.getHolder();
        //创建MediaPlayer对象
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); //设置多媒体类型
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                Toast.makeText(MainActivity.this,"播放完毕",Toast.LENGTH_SHORT).show();
            }
        });

        //********************控制视频的播放,暂停,停止*************************//
        btn_pause = findViewById(R.id.btn_pause);
        btn_play = findViewById(R.id.btn_play);
        btn_stop = findViewById(R.id.btn_stop);

        btn_pause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mediaPlayer.isPlaying()){
                    mediaPlayer.pause();
                }
            }
        });
        btn_play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(noPlay){
                    paly();
                    noPlay=false; //使视频处于播放状态
                }else
                {
                    mediaPlayer.start();
                }
            }
        });
        btn_stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mediaPlayer.isPlaying()){
                    mediaPlayer.stop();
                    noPlay=true;  //使视频处理没有播放状态
                }
            }
        });
    }
    //***********************播放视频方法*************************//
    public void paly(){
        mediaPlayer.reset();// 重置mediaPlayer
        mediaPlayer.setDisplay(surfaceHolder); //把视频画面输出到surfaceview中
        try {
            mediaPlayer.setDataSource(Environment.getExternalStorageDirectory()+
                    "/speakman.mp4");//设置要播放的视频
            mediaPlayer.prepare();  //预加载视频
        } catch (IOException e) {
            e.printStackTrace();
        }
        mediaPlayer.start();  //播放视频
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(mediaPlayer!=null){
            if(mediaPlayer.isPlaying()){
                mediaPlayer.stop();
                mediaPlayer.release();  //释放资源
            }
        }
    }
}

[12] Camera控制拍照

1.主程序中

public class MainActivity extends AppCompatActivity {

    private ImageView picture;
    private ImageButton takePhoto;
    private Uri imageUri;
    public static final int TAKE_PHOTO=1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        takePhoto = findViewById(R.id.take_photo);
        picture = findViewById(R.id.picture);

        takePhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //创建File对象,用于存储拍照后的照片,应用程序缓存目录
                File outputImage = new File(getExternalCacheDir(),"output_image.jpg");
                try {
                    if(outputImage.exists()){  //如果照片存在就删除
                        outputImage.delete();
                    }
                    outputImage.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }


        if(Build.VERSION.SDK_INT>=24){
                    imageUri = FileProvider.getUriForFile(MainActivity.this,
                            "appstore.xianchuang.com.cameratest.fileprovider",outputImage);
                }else{
                    imageUri=Uri.fromFile(outputImage);

                }

                //启动相机程序
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri); //指定图片的输出地址
                startActivityForResult(intent,TAKE_PHOTO);

            }
        });
    }
    //对相机的返回结果处理
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        switch (requestCode){
            case TAKE_PHOTO:
                if(requestCode==RESULT_OK){
                    //将拍摄的照片显示出来
                    try {
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
                                .openInputStream(imageUri));
                        picture.setImageBitmap(bitmap);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                break;
             default:
                 break;
        }
    }
}

2.Androidmanifest.xml中:

 <provider
            android:authorities="appstore.xianchuang.com.cameratest.fileprovider"
            android:name="android.support.v4.content.FileProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths"/>
        </provider>
    </application>

</manifest>

3.xml/file_paths中设置

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path
        name="my_images"
        path="."/>
</paths>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值