一、加载图片到内存
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView iv = (ImageView)findViewById(R.id.img);
//把一个文件图片转化成位图对象,然后显示
//android在表示图像的时候使用32位的手法去表示
//ARGB = 8 + 8 + 8 + 8 = 32位 , 4个字节表示一个像素 点
Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/big.jpg");
iv.setImageBitmap(bitmap);
}
二、显示大图片
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView iv = (ImageView) findViewById(R.id.iv);
//解码一张图片,得到位图图像
//android系统里面显示的位图都是32位位图, argb---透明8位、红色8位、绿色8位、蓝色8位
//一个像素点有4个字节长度
// Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/very_large_photo.jpg");
//创建一个位图解析选项对象
Options opts = new Options();
//代表的是取原图的宽度1/4的像素个数,和高度的1/4的像素个数,就是总大小的1/16
//设置采样率
//这个采样率一般不会写死,而是根据你的图片宽高和 屏幕分辨率的宽高得出的中间比例
//1.获取屏幕的分辨率
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
//Point outSize = new Point();
// display.getSize(outSize);
//得到屏幕的宽高
int width = display.getWidth();
int height = display.getHeight();
//2.获取图片的宽高
try {
ExifInterface exif = new ExifInterface("/mnt/sdcard/very_large_photo.jpg");
String imgHeight=exif.getAttribute(ExifInterface.TAG_IMAGE_LENGTH);
String imgWidth=exif.getAttribute(ExifInterface.TAG_IMAGE_WIDTH);
//这里可以计算得到他们的宽高比例,然后取中间值即可。
} catch (IOException e) {
e.printStackTrace();
}
//设置缩放比例
opts.inSampleSize= 4;
Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/very_large_photo.jpg", opts);
//显示位图到imageview上
iv.setImageBitmap(bitmap);
}
三、对图片的操作
- 得到原图
Bitmap srcBitmap = BitmapFactory.decodeFile("/mnt/sdcard/tp1.jpg");
- 创建拷贝
//下面就是显示缩放后的图片 --- 实际上我们是要对以上的这张图片在内存中的拷贝进行操作。
//1. 得到原图的拷贝, 参数一 和 二 是拷贝图片的宽高大小 ,参数三: 是原图的配置信息。
//有点类似绘制 八骏图.... 不过请注意,此句代码并没有把图像给画出来,仅仅是裁剪了一张纸张样式。 是一张空白的纸张,是一个空白的bitmap
Bitmap copyBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());
- 创建画板
//2 .创建画板 -把那份空白的纸张放到画板上,准备作画
Canvas canvas = new Canvas(copyBitmap);
- 创建画笔
//3.开始创建画笔
Paint paint = new Paint();
- 创建矩阵
//4.创建矩阵 -- 绘画出来 1:1比例的图片
Matrix matrix = new Matrix();
//设置图像的缩放 ,宽高都是原来的 1/2
matrix.setScale(0.8f, 0.2f);
- 开始作画
//5.开始作画 参数一: 参照哪一张图开始作画 ,参数二: 矩阵对象 ,参数三: 画笔对象
canvas.drawBitmap(srcBitmap, matrix, paint);
- 显示图片
//如果以上代码执行没有问题,那么现在的拷贝纸张里面就有了图像了。所以就可以直接显示。
iv_copy.setImageBitmap(copyBitmap);

image.png

image.png

image.png

image.png
三、随手涂鸦
public class MainActivity extends Activity implements OnClickListener{
Paint paint ;
Bitmap copyBitmap ;
Canvas canvas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
paint = new Paint();
//设置画笔的默认大小是5
paint .setStrokeWidth(5);
//创建一份 300*300的位图图像 ,使用的配置是 32位的手法表示
copyBitmap = Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888);
canvas = new Canvas(copyBitmap);
canvas.drawColor(Color.WHITE);
findViewById(R.id.red).setOnClickListener(this);
findViewById(R.id.green).setOnClickListener(this);
findViewById(R.id.blue).setOnClickListener(this);
findViewById(R.id.yellow).setOnClickListener(this);
findViewById(R.id.purple).setOnClickListener(this);
SeekBar seekBar = (SeekBar) findViewById(R.id.seekbard);
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
//停止移动
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//拿到当前的进度
int progress = seekBar.getProgress();
paint.setStrokeWidth(progress);
Toast.makeText(MainActivity.this, "画笔的粗细是:"+progress, 0).show();
}
//开始移动
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
//移动中
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
}
});
final ImageView iv = (ImageView)findViewById(R.id.iv);
iv.setOnTouchListener(new OnTouchListener() {
float startX ,startY;
@Override
public boolean onTouch(View v, MotionEvent event) {
//判断当前的手指动作
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: //按下的动作
startX = event.getX();
startY = event.getY();
System.out.println("down---"+startX+"-"+startY);
break;
case MotionEvent.ACTION_MOVE: //移动的动作
float stopX = event.getX();
float stopY = event.getY();
System.out.println("move---"+stopX +"-"+stopY);
canvas.drawLine(startX, startY, stopX, stopY, paint);
//画完之后要马上显示到imageView上,否则画的东西仅仅是保留在了bitmap里面
iv.setImageBitmap(copyBitmap);
//显示完毕之后,要马上初始化这个起始点
startX = stopX;
startY = stopY;
break;
case MotionEvent.ACTION_UP: //弹起的动作
System.out.println("up---");
break;
}
//返回的是false ,那么系统将会把这个与屏幕交互的事件继续往下传递给其他的监听器,让他们继续处理。
//返回的是true , 代表的是事件到此结束,我们这个监听器要自己处理这个事件。
return true;
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.red: //点击了红色
paint.setColor(Color.RED);
Toast.makeText(this, "画笔的颜色是:红色", 0).show();
break;
case R.id.green:
paint.setColor(Color.GREEN);
Toast.makeText(this, "画笔的颜色是:绿色", 0).show();
break;
case R.id.blue:
paint.setColor(Color.BLUE);
Toast.makeText(this, "画笔的颜色是:蓝色", 0).show();
break;
case R.id.yellow:
paint.setColor(Color.YELLOW);
Toast.makeText(this, "画笔的颜色是:黄色", 0).show();
break;
case R.id.purple:
paint.setColor(0xffff00ff);
Toast.makeText(this, "画笔的颜色是:紫色", 0).show();
break;
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == R.id.save){//点击了保存的菜单
try {
//参数一: 保存的图片类型
//参数二: 保存的图片质量
//参数三: 保存的路径
OutputStream stream = new FileOutputStream("/mnt/sdcard/"+System.currentTimeMillis()+".jpg");
copyBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
Toast.makeText(this, "保存图片成功", 0).show();
//发送一个广播,欺骗系统,让它以为现在SD卡被重新挂载上来,所以系统会再次扫描SD卡
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
intent.setData(Uri.parse("file://"));
sendBroadcast(intent);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
return super.onOptionsItemSelected(item);
}
//用来创建menu菜单的作用
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;`
}
四、调色板
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView iv = (ImageView)findViewById(R.id.iv);
final Bitmap srcBitmap = BitmapFactory.decodeFile("/mnt/sdcard/tp1.jpg");
final Bitmap copytBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());
final Canvas canvas = new Canvas(copytBitmap);
final Paint paint = new Paint();
final Matrix matrix = new Matrix();
canvas.drawBitmap(srcBitmap, matrix, paint);
iv.setImageBitmap(copytBitmap);
SeekBar seekBar = (SeekBar) findViewById(R.id.seekbar);
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int progress = seekBar.getProgress();
float value = progress/ 50.0f;
Toast.makeText(MainActivity.this, "当前的颜色比例值是:"+value, 0).show();
//定义颜色矩阵
ColorMatrix cm = new ColorMatrix();
cm.set(new float[] {
1*value, 0, 0, 0, 0, //定义红色的比例值
0, 1, 0, 0, 0, //绿色
0, 0, 1, 0, 0,//蓝色
0, 0, 0, 1, 0//透明度
});
paint.setColorFilter(new ColorMatrixColorFilter(cm));
//拖动进度滞后,要重新作画,在原来的画笔基础上加上了颜色矩阵,这个时候图片的颜色就会发生变化
canvas.drawBitmap(srcBitmap, matrix, paint);
//作画完毕之后,要记得重新显示图片,否则看到的还是原来的那张图片
iv.setImageBitmap(copytBitmap);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
}
});`
}
五、撕衣服
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView iv_pre = (ImageView) findViewById(R.id.pre);
//1,. 得到原图
Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pre);
final Bitmap copyBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());
Canvas canvas = new Canvas(copyBitmap);
Paint paint = new Paint();
canvas.drawBitmap(srcBitmap, new Matrix(), paint);
iv_pre.setImageBitmap(copyBitmap);
//要想改变手指划过的地方像素颜色值,必须要知道当前的手指落位的地方 。
iv_pre.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
int downX = (int) event.getX();
int downY = (int) event.getY();
try {
for (int i = -7; i < 8; i++) {
for (int j = -7; j < 8; j++) {
if(Math.sqrt(i*i+j*j) <= 7){
//设置指定的坐标点的颜色值是透明的
copyBitmap.setPixel(downX+i, downY+j, Color.TRANSPARENT);
//立即更新到ImageView上
iv_pre.setImageBitmap(copyBitmap);
}
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case MotionEvent.ACTION_MOVE:
int moveX = (int) event.getX();
int moveY = (int) event.getY();
try {
for (int i = -7; i < 8; i++) {
for (int j = -7; j < 8; j++) {
if(Math.sqrt(i*i+j*j) <= 7){
//设置指定的坐标点的颜色值是透明的
copyBitmap.setPixel(moveX+i, moveY+j, Color.TRANSPARENT);
//立即更新到ImageView上
iv_pre.setImageBitmap(copyBitmap);
}
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
});`
`}`
### getX和 getRawX的区别
* getX
> 当前的触摸位置到控件的左边间距
* getRawX
当前的触摸位置到屏幕的左边间距长度
### 六、音乐播放器
public class MainActivity extends Activity {
EditText et_path ;
`MediaPlayer mediaPlayer ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_path = (EditText) findViewById(R.id.path);
}
public void play(View v){
String path = et_path.getText().toString();
try {
//1.构建一个多媒体播放器
mediaPlayer = new MediaPlayer();
//2.设置播放数据源
mediaPlayer.setDataSource(path);
//这个方法的准备工作是在主线程里面执行。
mediaPlayer.prepare();
//在子线程里面进行缓冲,准备
//mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
//当缓冲到可以播放的时候,就来到了这个方法
@Override
public void onPrepared(MediaPlayer mp) {
//开始播放
mediaPlayer.start();
}
});
//1、跳转到指定的位置播放歌曲,断点续播
//mediaPlayer.seekTo(300000);
//2、播放错误时,会调用,
/* mediaPlayer.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
return false;
}
});*/
// 3、设置无限循环
//mediaPlayer.setLooping(true);
/*播放完毕的监听器,可以再这里继续播放下一首歌
**/
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mediaPlayer.seekTo(0);
mediaPlayer.start();
}
});
mediaPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
public void pause(View v){
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();
}else{
mediaPlayer.start();
}
}
public void stop(View v){
if(mediaPlayer != null){
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
}
}
七、soundpool用来播放一些简短的音乐文件,如枪声等。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//SoundPool 有一点类似 线程池的概念
//指定存放的最大值 , 音频流类型,音频的质量
pool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
//加载音频文件到池子里面
id = pool.load(this, R.raw.shoot, 1);
}
public void shoot(View v){
//指定播放的额声音id , 左声道,右声道 ,优先级别 ,是否循环, 播放的速率
pool.play(id, 1.0f, 1.0f, 0, 0, 1.0f);
}
八、视频播放器
//1.找到视频播放控件
VideoView vv = (VideoView) findViewById(R.id.vv);
//2.设置播放什么资源
vv.setVideoPath("/mnt/sdcard/oppo.3gp");
//设置videoview里面显示控制按钮
MediaController controller = new MediaController(this);
//设置controller控制哪一个view
controller.setAnchorView(vv);
//设置多媒体控制器
vv.setMediaController(controller);
//3.设置播放
vv.start();`
九、surfaceView
- surfaceview是一个比较高级的控件,它可以在单位时间内大量的切换画面、渲染图像显示
- 可以在子线程里面更新UI的
- 内部使用了双缓冲机制
- 线程0:计算数据--更新UI--计算数据
- 线程1: 更新UI---计算数据 --更新UI *
public class MainActivity extends Activity {
SurfaceView sv ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//视图
sv= (SurfaceView) findViewById(R.id.sv);
//surfaceview非常的消耗内存,系统并不是一开始就渲染它,而是等界面完全显示出来之后,才渲染它。它才会被创建出来。所以采用回调方法
//拿到控制器
SurfaceHolder holder = sv.getHolder();
//设置一个回调,当surfaceview的状态发生了改变。
holder.addCallback(new Callback() {
//当surfaceView销毁 ,当surfaceView看不见的时候,就会调用onDesotry方法
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
System.out.println("surfaceDestroyed。。。");
}
//当surface创建完毕 ,当它可见的时候调用。
@Override
public void surfaceCreated(SurfaceHolder holder) {
System.out.println("surfaceCreated。。。");
new Thread(){
@Override
public void run() {
//得到surfaceview的控制器
SurfaceHolder holder = sv.getHolder();
for (int i = 0; i < 100; i++) {
int radius = 5+i;
//锁定surfaceview里面的画布,然后返回。
Canvas canvas = holder.lockCanvas();
canvas.drawColor(Color.BLACK);
Paint paint = new Paint();
paint.setColor(Color.RED);
canvas.drawCircle(200, 200, radius, paint);
//解锁画布,并且马上更新画布上的图像,显示到界面上
holder.unlockCanvasAndPost(canvas);
//休眠100毫秒
SystemClock.sleep(10);
}
}
}.start();
}
//当surface大小值发生改变
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
System.out.println("surfaceChanged。。。");
}
});
}
十、视频播放器surfaceview版
public class MainActivity extends Activity {
MediaPlayer mediaPlayer ;
SharedPreferences sp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sp = getSharedPreferences("music", 0);
SurfaceView sv = (SurfaceView) findViewById(R.id.sv);
//获取控制器
SurfaceHolder holder = sv.getHolder();
//设置回调
holder.addCallback(new Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//获取到当前的播放位置
int position = mediaPlayer.getCurrentPosition();
//记录住当前播放到的位置
sp.edit().putInt("position", position).commit();
mediaPlayer.release();
mediaPlayer = null;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
//在创建完毕之后就要播放视频
try {
//获取到上一次播放的记录位置
int position = sp.getInt("position", 0);
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource("/mnt/sdcard/oppo.3gp");
mediaPlayer.prepare();
//跳转到上一次的位置,然后播放
mediaPlayer.seekTo(position);
//视屏控制器,设置视频的播放画面显示到surfaceView上
mediaPlayer.setDisplay(holder);
mediaPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
});
}
}
十一、拍照
public class MainActivity extends Activity {
ImageView iv ;
File file ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
}
public void click(View v){
//使用系统的相机拍照,然后返回一张图片给我们显示到imageView上
//定义intent意图,指定action动作
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//定义保存的文件路径是这个
file = new File("/mnt/sdcard/"+System.currentTimeMillis()+".jpg");
/*
* 区别:
* Uri.parse("cotent://aaa");
* Uri.fromFile(file); ----> file://mnt/
*/
Uri uri = Uri.fromFile(file);
//拍照完毕之后,把这张图片存储起来,输出到某一个指定的路径所在
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); // set the image file name
// start the image capture Intent
startActivityForResult(intent, 1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//一旦满足这个条件,必然是上面声明的那个文件已经存在了。并且也有数据了。
if(file.exists() && file.length() > 0 ){
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
iv.setImageBitmap(bitmap);
}
}
}
十二、录制视频
public class MainActivity extends Activity {
VideoView vv ;
File file ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vv = (VideoView) findViewById(R.id.vv);
}
public void click(View v){
//定义intent意图,指定action动作
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
//定义保存的文件路径是这个
file = new File(Environment.getExternalStorageDirectory() , System.currentTimeMillis()+".3gp");
/*
*
* Uri.parse("cotent://aaa");
* Uri.fromFile(file); ----> file://mnt/
*/
Uri uri = Uri.fromFile(file);
//输出到某一个指定的路径所在
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); // set the image file name
// start the image capture Intent
startActivityForResult(intent, 1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//一旦满足这个条件,必然是上面声明的那个文件已经存在了。并且也有数据了。
if(file.exists() && file.length() > 0 ){
vv.setVideoPath(file.getAbsolutePath());
MediaController controller = new MediaController(this);
controller.setAnchorView(vv);
vv.setMediaController(controller);
vv.start();
}
}
}
十三、传感器
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView tv = (TextView)findViewById(R.id.tv);
/* 获取所有的传感器
*
* SensorManager manager = (SensorManager) getSystemService(SENSOR_SERVICE);
List<Sensor> list = manager.getSensorList(Sensor.TYPE_ALL);
StringBuilder stringBuilder = new StringBuilder();
for (Sensor sensor : list) {
String name = sensor.getName();
int type = sensor.getType();
stringBuilder.append("name="+name+"----type="+type);
}
tv.setText(stringBuilder.toString());*/
SensorManager manager = (SensorManager) getSystemService(SENSOR_SERVICE);
//得到光线传感器
Sensor sensor = manager.getDefaultSensor(Sensor.TYPE_LIGHT);
//注册一个监听器,当光线发送了改变,就会调用里面的方法,第三个参数是速率。
manager.registerListener(new SensorEventListener() {
//数据发生了改变就调用
@Override
public void onSensorChanged(SensorEvent event) {
float value = event.values[0];
tv.setText("当前的光线强度是:"+value);
}
//精度发生了改变
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
}
网友评论