1.获取手机的分辨率
MainActivity
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Point;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
private String permssionRequestCode []={Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS};
private ImageView myimg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActivityCompat.requestPermissions(this, permssionRequestCode,0);
ActivityCompat.requestPermissions(this, permssionRequestCode,1);
ActivityCompat.requestPermissions(this, permssionRequestCode,2);
myimg=findViewById(R.id.myImg);
//获取手机的分辨率windowManager,smsManager,TelephoneManger
WindowManager windowManager=(WindowManager)getSystemService(WINDOW_SERVICE);
/*
int height=windowManager.getDefaultDisplay().getHeight();//获取高
int width=windowManager.getDefaultDisplay().getWidth();
*/
Point point=new Point();
windowManager.getDefaultDisplay().getSize(point);
int width=point.x;
int height=point.y;
Log.d("TAG", "width: "+width+"---"+"height: "+height);
}
public void btnclick(View view){
Bitmap bitmap=BitmapFactory.decodeFile("/mnt/sdcard/Download/timg.jpeg");
myimg.setImageBitmap(bitmap);
}
}
打印
2020-08-25 17:53:46.804 18414-18414/com.fengray.ex079 D/TAG: width: 1080—height: 1776
2.获取图片的尺寸、分辨率
package com.fengray.ex079;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Point;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
private String permssionRequestCode []={Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS};
private ImageView myimg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActivityCompat.requestPermissions(this, permssionRequestCode,0);
ActivityCompat.requestPermissions(this, permssionRequestCode,1);
ActivityCompat.requestPermissions(this, permssionRequestCode,2);
myimg=findViewById(R.id.myImg);
//获取手机的分辨率windowManager,smsManager,TelephoneManger
WindowManager windowManager=(WindowManager)getSystemService(WINDOW_SERVICE);
/*
int height=windowManager.getDefaultDisplay().getHeight();//获取高
int width=windowManager.getDefaultDisplay().getWidth();
*/
Point point=new Point();
windowManager.getDefaultDisplay().getSize(point);
int width=point.x;
int height=point.y;
Log.d("TAG", "width: "+width+"---"+"height: "+height);
}
@SuppressLint("SdCardPath")
public void btnclick(View view){
//创建一个位图工厂的配置参数
BitmapFactory.Options options=new BitmapFactory.Options();
//解码器不去真正地解析位图,但是还能获取图片的宽和高的信息
options.inJustDecodeBounds=true;
BitmapFactory.decodeFile("/mnt/sdcard/Download/timg.jpeg",options);
//myimg.setImageBitmap(bitmap);
//获取图片的宽和高信息
int imgWidth=options.outWidth;
int imgHeight=options.outHeight;
Log.d("TAG", "图片宽:width: "+imgWidth+"---"+"图片高:height: "+imgHeight);
//Log.d("TAG", "btnclick: "+bitmap);
}
}
3.获取图片缩放比
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Point;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
private String permssionRequestCode []={Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS};
private ImageView myimg;
int width,height;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActivityCompat.requestPermissions(this, permssionRequestCode,0);
ActivityCompat.requestPermissions(this, permssionRequestCode,1);
ActivityCompat.requestPermissions(this, permssionRequestCode,2);
myimg=findViewById(R.id.myImg);
//获取手机的分辨率windowManager,smsManager,TelephoneManger
WindowManager windowManager=(WindowManager)getSystemService(WINDOW_SERVICE);
/*
int height=windowManager.getDefaultDisplay().getHeight();//获取高
int width=windowManager.getDefaultDisplay().getWidth();
*/
Point point=new Point();
windowManager.getDefaultDisplay().getSize(point);
width=point.x;
height=point.y;
Log.d("TAG", "width: "+width+"---"+"height: "+height);
}
@SuppressLint("SdCardPath")
public void btnclick(View view){
//创建一个位图工厂的配置参数
BitmapFactory.Options options=new BitmapFactory.Options();
//解码器不去真正地解析位图,但是还能获取图片的宽和高的信息
options.inJustDecodeBounds=true;
BitmapFactory.decodeFile("/mnt/sdcard/Download/timg.jpeg",options);
//myimg.setImageBitmap(bitmap);
//获取图片的宽和高信息
int imgWidth=options.outWidth;
int imgHeight=options.outHeight;
Log.d("TAG", "图片宽:width: "+imgWidth+"---"+"图片高:height: "+imgHeight);
//计算缩放比,按照大的缩放比来
int scale=1;
int scaleX=imgWidth/width;
int scaleY=imgHeight/height;
if (scaleX>=scaleY && scaleX>scale){
scale=scaleX;
}
if (scaleY<scaleX && scaleY>scale){
scale=scaleY;
}
//按照缩放比进行显示,实际按照缩放比采样
options.inSampleSize=scale;
//按照缩放比解析位图
//false则解码器真正地解析位图,但是还能获取图片的宽和高的信息
options.inJustDecodeBounds=true;
Bitmap bitmap=BitmapFactory.decodeFile("/mnt/sdcard/Download/timg.jpeg",options);
myimg.setImageBitmap(bitmap);
//Log.d("TAG", "btnclick: "+bitmap);
}
}
4.获取图片副本
package com.fengray.ex080;
import androidx.appcompat.app.AppCompatActivity;
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.widget.ImageView;
public class MainActivity extends AppCompatActivity {
private ImageView myimg1,myimg2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myimg1=findViewById(R.id.myimg1);
myimg2=findViewById(R.id.myimg2);
//1把jpg图片转换成bitmap显示到控件上
Bitmap srcbitmap=BitmapFactory.decodeResource(getResources(),R.drawable.gril02);
//2操作图片
//srcbitmap.setPixel(0, 0, Color.RED);
myimg1.setImageBitmap(srcbitmap);
//创建原图的副本,创建了一个大小和原图一样的空白的白纸
Bitmap copybitmap=Bitmap.createBitmap(srcbitmap.getWidth(),srcbitmap.getHeight(),srcbitmap.getConfig());
//创建一直画笔
Paint pianter=new Paint();
//创建一个画布,把白纸铺到画布上
Canvas canvas=new Canvas(copybitmap);
//开始作画,参数Matrix是矩阵的意思
canvas.drawBitmap(srcbitmap,new Matrix(),pianter);
//操作画出来的图片
copybitmap.setPixel(0,0,Color.RED);
//显示到第二个img控件上
myimg2.setImageBitmap(copybitmap);
}
}
5.图形处理的api
1、旋转:
//创建原图的副本,创建了一个大小和原图一样的空白的白纸
Bitmap copybitmap=Bitmap.createBitmap(srcbitmap.getWidth(),srcbitmap.getHeight(),srcbitmap.getConfig());
//创建一直画笔
Paint pianter=new Paint();
//创建一个画布,把白纸铺到画布上
Canvas canvas=new Canvas(copybitmap);
//开始作画,参数Matrix是矩阵的意思
Matrix matrix=new Matrix();
//对图片进行旋转
matrix.setRotate(20,srcbitmap.getWidth()/2,srcbitmap.getHeight()/2);
canvas.drawBitmap(srcbitmap,matrix,pianter);
//操作画出来的图片
copybitmap.setPixel(0,0,Color.RED);
//显示到第二个img控件上
myimg2.setImageBitmap(copybitmap);
2、缩放:
//创建原图的副本,创建了一个大小和原图一样的空白的白纸
Bitmap copybitmap=Bitmap.createBitmap(srcbitmap.getWidth(),srcbitmap.getHeight(),srcbitmap.getConfig());
//创建一直画笔
Paint pianter=new Paint();
//创建一个画布,把白纸铺到画布上
Canvas canvas=new Canvas(copybitmap);
//开始作画,参数Matrix是矩阵的意思
Matrix matrix=new Matrix();
//对图片进行旋转
matrix.setScale(0.5f,0.5f);//两个参数分辨是宽高的缩放倍数
canvas.drawBitmap(srcbitmap,matrix,pianter);
//操作画出来的图片
copybitmap.setPixel(0,0,Color.RED);
//显示到第二个img控件上
myimg2.setImageBitmap(copybitmap);
3、平移:
//创建原图的副本,创建了一个大小和原图一样的空白的白纸
Bitmap copybitmap=Bitmap.createBitmap(srcbitmap.getWidth(),srcbitmap.getHeight(),srcbitmap.getConfig());
//创建一直画笔
Paint pianter=new Paint();
//创建一个画布,把白纸铺到画布上
Canvas canvas=new Canvas(copybitmap);
//开始作画,参数Matrix是矩阵的意思
Matrix matrix=new Matrix();
//对图片进行平移
matrix.setTranslate(80f,0.5f);//两个参数分辨是宽高的缩放倍数
canvas.drawBitmap(srcbitmap,matrix,pianter);
//操作画出来的图片
copybitmap.setPixel(0,0,Color.RED);
//显示到第二个img控件上
myimg2.setImageBitmap(copybitmap);
4、镜像:
缩放和平移的一个组合
//创建原图的副本,创建了一个大小和原图一样的空白的白纸
Bitmap copybitmap=Bitmap.createBitmap(srcbitmap.getWidth(),srcbitmap.getHeight(),srcbitmap.getConfig());
//创建一直画笔
Paint pianter=new Paint();
//创建一个画布,把白纸铺到画布上
Canvas canvas=new Canvas(copybitmap);
//开始作画,参数Matrix是矩阵的意思
Matrix matrix=new Matrix();
//对图片进行镜像
matrix.setScale(-1.0f,1);//负数产生翻转镜像
//post方法在上一次基础上进行新的操作,set方法,每次都进行全新操作,不保留上次的方法
matrix.postTranslate(srcbitmap.getWidth(),0);
canvas.drawBitmap(srcbitmap,matrix,pianter);
//操作画出来的图片
copybitmap.setPixel(0,0,Color.RED);
//显示到第二个img控件上
myimg2.setImageBitmap(copybitmap);
6.绘图板实例
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.Intent;
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.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.SystemClock;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class MainActivity extends AppCompatActivity {
private ImageView myimg;
private Bitmap scrBitmap,copyBitmap;
private Paint paint;
private Canvas canvas;
private int action;
private int startX,startY;
private String permssionRequestCode []={Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActivityCompat.requestPermissions(this, permssionRequestCode,0);
ActivityCompat.requestPermissions(this, permssionRequestCode,1);
//用来显示绘制的内容
myimg=findViewById(R.id.myimg);
//获取原图
scrBitmap= BitmapFactory.decodeResource(getResources(),R.drawable.gril011);
//获取原图副本,相当于一个空白白纸
copyBitmap=Bitmap.createBitmap(scrBitmap.getWidth(),scrBitmap.getHeight(),scrBitmap.getConfig());
//创建空白画笔及画布
paint=new Paint();
canvas=new Canvas(copyBitmap);//把白纸放入画布
//开始作画
canvas.drawBitmap(scrBitmap,new Matrix(),paint);
//canvas.drawLine(20,30,50,80,paint);
//设置在画布上
myimg.setImageBitmap(copyBitmap);
//给控件设置一个触摸事件
myimg.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
action=event.getAction();
Log.d("TAG", "onTouch: "+action);
switch (action){
//获得当前时间
case MotionEvent.ACTION_DOWN:
//获取划线起始位置
startX=(int)event.getX();
startY=(int)event.getY();
Log.d("TAG", "onTouch: action down "+startX+"--"+startY);
break;
case MotionEvent.ACTION_MOVE:
//获取结束位置
int stopX=(int)event.getX();
int stopY=(int)event.getY();
Log.d("TAG", "onTouch: action move "+stopX+"--"+stopY);
//不停的地划线
canvas.drawLine(startX,startY,stopX,stopY,paint);
//再显示到控件上
myimg.setImageBitmap(copyBitmap);
//刷新起点
startX=stopX;
startY=stopY;
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return true;
}
});
}
//红色Click
public void redClick (View view){
//设定画笔颜色
paint.setColor(Color.RED);
}
//加粗Click
public void boldClick (View view){
paint.setStrokeWidth(15);
}
//保存Click
public void saveClick (View view){
try {
Log.d("TAG", "saveClick: 11111111");
File file=new File(Environment.getExternalStorageDirectory().getPath(),"d33.png");
FileOutputStream fileOutputStream=new FileOutputStream(file);
Log.d("TAG", "saveClick: 2222222");
//第一个参数:图片的格式
//quality:保存图片的质量
//保存图片的文件流
copyBitmap.compress(Bitmap.CompressFormat.PNG,100,fileOutputStream);
//发送一条广播,欺骗系统图库的应用
Intent intent=new Intent();
//设置action
intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
sendBroadcast(intent);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
7.撕衣服案例
点击时将衣服图片设置为透明
package com.fengray.ex082;
import androidx.appcompat.app.AppCompatActivity;
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.media.Image;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
private ImageView imgPre,imgAfter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imgPre=findViewById(R.id.imgpre);
//imgAfter=findViewById(R.id.imgafter);
//获得图片原图
Bitmap srcbitmap= BitmapFactory.decodeResource(getResources(),R.drawable.girlpre);
//创建图片副本,与原图大小一致
final Bitmap copybitmap=Bitmap.createBitmap(srcbitmap.getWidth(),srcbitmap.getHeight(),srcbitmap.getConfig());
//创建画笔、画布
Paint paint=new Paint();
Canvas canvas=new Canvas(copybitmap);
//开始作画
canvas.drawBitmap(srcbitmap,new Matrix(),paint);
imgPre.setImageBitmap(copybitmap);
imgPre.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d("TAG", "onTouch: ----");
//具体判断触摸事件
switch (event.getAction()){
case MotionEvent.ACTION_MOVE:
Log.d("TAG", "onTouch: ----"+event.getAction());
for (int i=-7;i<7; i++){//增加x坐标
for (int j=-7;j<7;j++){//增加y坐标
copybitmap.setPixel((int)event.getX()+i,(int)event.getY()+j, Color.TRANSPARENT);
}
}
//更新一下控件
imgPre.setImageBitmap(copybitmap);
}
return true;
}
});
}
}
8.音乐播放MediaPlayer类
用于播放音频或者视频
import androidx.appcompat.app.AppCompatActivity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//点击执行播放
public void btnPlay(View view){
//初始化MediaPlayer
MediaPlayer mediaPlayer=new MediaPlayer();
try {
mediaPlayer.setDataSource("/data/media/0/Music/xkfy.mp3");
//mediaPlayer.setDataSource("http://www.fengray.com/xkfy.mp3");网络播放使用
mediaPlayer.setLooping(true);
//准备播放
mediaPlayer.prepare();
//开始播放
mediaPlayer.start();
//mediaPlayer.prepareAsync();//网络播放使用
} catch (IOException e) {
e.printStackTrace();
}
}
}
9.surfaceView控件播放视频
package com.fengray.ex083;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private String permssionRequestCode []={Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE};
private SurfaceView sfv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActivityCompat.requestPermissions(this, permssionRequestCode,0);
ActivityCompat.requestPermissions(this, permssionRequestCode,1);
new Thread(){
@Override
public void run() {
SystemClock.sleep(400);//surfaceView是重量型控件,耗时且内部有两个线程,因此,整个逻辑要放在子线程中实现,
sfv=findViewById(R.id.mysv);
//获得surfaceholder对象,用来维护视频内容
SurfaceHolder holder = sfv.getHolder();
//初始化MediaPlayer
MediaPlayer mediaPlayer=new MediaPlayer();
try {
mediaPlayer.setDataSource("http://www.fengray.com/xkfy.mp4");//网络播放使用
//准备播放
mediaPlayer.prepareAsync();
//surfaceholder是用来维护视频播放内容的
mediaPlayer.setDisplay(holder);
//开始播放
mediaPlayer.start();
//mediaPlayer.prepareAsync();//网络播放使用
} catch (IOException e) {
e.printStackTrace();
}
super.run();
}
}.start();
}
10.videoView控件播放视频
videView是对surfaceView和MediaPlayer的封装
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.VideoView;
public class MainActivity extends AppCompatActivity {
private VideoView mVideoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到控件
mVideoView=findViewById(R.id.videoView);
//设置播放路径
mVideoView.setVideoPath("http://www.sina.com/cc.mp4");
}
}
11.vitamio框架(开源)
略
12.照相和录像
使用隐式Intent
package com.fengray.ex084;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.hardware.camera2.CaptureRequest;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.VideoView;
import java.io.File;
public class MainActivity extends AppCompatActivity {
private VideoView mVideoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click1(View view){
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File file=new File(Environment.getExternalStorageDirectory().getPath(),"name.png");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent,1 ) ;
}
public void click2(View view){
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File file=new File(Environment.getExternalStorageDirectory().getPath(),"name.mp4");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent,2 ) ;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
Log.d("TAG", "onActivityResult: 方法执行了");
super.onActivityResult(requestCode, resultCode, data);
}
}