图像处理技术
[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]绘制图片
- 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] 逐帧动画
- 在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>
- 布局文件中背景设为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)
- 创建动画资源文件
<?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>
- 主程序中
Animation anim= AnimationUtils.loadAnimation(MainActivity.this,R.drawable.xxx);
button.startAnimation(anim);
[8]MediaPlayer
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
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>