一、显示分辨率特别大的图片
- 步骤:
- 将图片转化为Bitmap类型(转换成位图后不会失真)
- 获取手机分辨率
- 获取图片分辨率
- 获取比例大小,按照比例大的进行缩放
- 显示图片
- 代码实现:
package com.chenzhaoyu.loadmaxpicturedemo; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.WindowManager; import android.widget.ImageView; public class MainActivity extends Activity { private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = findViewById(R.id.iv); } public void click(View view) { // 【1】将图片转化为位图 // 设置一个位图工厂 BitmapFactory.Options opts = new BitmapFactory.Options(); // 设置其属性,该属性如果为true,则bitmap为null,并且可以获取该位图的宽和高 opts.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(), R.drawable.back, opts); // 【2】获取手机分辨率 WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); int phoneWidth = windowManager.getDefaultDisplay().getWidth(); int phoneHeight = windowManager.getDefaultDisplay().getHeight(); Log.i("MainActivity", phoneWidth + ""); Log.i("MainActivity", phoneHeight + ""); // 【3】获取图片分辨率 int picWidth = opts.outWidth; int picHeight = opts.outHeight; Log.i("MainActivity", picWidth + ""); Log.i("MainActivity", picHeight + ""); // 【4】计算比例大小 int scale = 1; int widthScale = picWidth / phoneWidth; int heightScale = picHeight / phoneHeight; if (widthScale >= heightScale && widthScale > scale) { scale = widthScale; } if (heightScale > widthScale && heightScale > scale) { scale = heightScale; } Log.i("MainActivity", scale + ""); // 【5】显示图片 //按照缩放比进行显示 opts.inSampleSize = scale; //按照缩放比解析位图 opts.inJustDecodeBounds = false; Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.back, opts); iv.setImageBitmap(bitmap); } }
二、创建图形的副本
- 步骤:
- 将图片转化为Bitmap类型
- 创建原图的副本(因为在原图上不能进行修改,因此必须创建副本)
- 创建一个与原图大小一致的空白纸
- 创建画笔
- 将纸放在画板上
- 开始制图
- 操作绘制出来的图片
- 将修改的图片展示出来
- 代码实现:
package com.chenzhaoyu.paintpicturedemo; import android.app.Activity; 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.view.MotionEvent; import android.view.View; import android.widget.ImageView; public class MainActivity extends Activity { private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = findViewById(R.id.iv); //【1】创建副本 //[1] 创建空白纸 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.paint); final Bitmap copyBitmap = bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig()); //[2] 创建画笔 final Paint paint = new Paint(); paint.setColor(Color.GREEN); paint.setStrokeWidth(10.0f); //[3] 创建画布 final Canvas canvas = new Canvas(copyBitmap); //[4] 绘制图形 canvas.drawBitmap(bitmap, new Matrix(), paint); iv.setImageBitmap(copyBitmap); //【2】为控件设置触摸事件 iv.setOnTouchListener(new View.OnTouchListener() { int startX = 0; int startY = 0; @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { //按下屏幕时事件 case MotionEvent.ACTION_DOWN: startX = (int) event.getX(); startY = (int) event.getY(); break; //离开屏幕时事件 case MotionEvent.ACTION_MOVE: int endX = (int) event.getX(); int endY = (int) event.getY(); canvas.drawLine(startX, startY, endX, endY, paint); iv.setImageBitmap(copyBitmap); startX = endX; startY = endY; break; } return true; } }); } }
三、画画板功能实现
- 步骤:
- 创建位图副本
- 创建空白纸
- 创建画笔
- 创建画布
- 绘制图形
- 为ImageView控件设置触摸事件
- 创建位图副本
- 代码实现:
package com.chenzhaoyu.paintpicturedemo; import android.app.Activity; 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.view.MotionEvent; import android.view.View; import android.widget.ImageView; public class MainActivity extends Activity { private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = findViewById(R.id.iv); //【1】创建副本 //[1] 创建空白纸 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.paint); final Bitmap copyBitmap = bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig()); //[2] 创建画笔 final Paint paint = new Paint(); paint.setColor(Color.GREEN); paint.setStrokeWidth(10.0f); //[3] 创建画布 final Canvas canvas = new Canvas(copyBitmap); //[4] 绘制图形 canvas.drawBitmap(bitmap, new Matrix(), paint); iv.setImageBitmap(copyBitmap); //【2】为控件设置触摸事件 iv.setOnTouchListener(new View.OnTouchListener() { int startX = 0; int startY = 0; @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { //按下屏幕时事件 case MotionEvent.ACTION_DOWN: startX = (int) event.getX(); startY = (int) event.getY(); break; //离开屏幕时事件 case MotionEvent.ACTION_MOVE: int endX = (int) event.getX(); int endY = (int) event.getY(); canvas.drawLine(startX, startY, endX, endY, paint); iv.setImageBitmap(copyBitmap); startX = endX; startY = endY; break; } return true; } }); } }
四、画笔的附加功能
- 改变画笔颜色
paint.setColor(Color.GREEN) - 改变画笔粗细
paint.setStrokeWidth(10.0f)
五、刮刮乐应用实现
- 代码实现:
package com.chenzhaoyu.picturepratisedemo; import android.app.Activity; 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.view.MotionEvent; import android.view.View; import android.widget.ImageView; public class MainActivity extends Activity { private Bitmap copyBitmap; private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = findViewById(R.id.iv); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.paint2); // 创建副本 copyBitmap = bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig()); Paint paint = new Paint(); Canvas canvas = new Canvas(copyBitmap); canvas.drawBitmap(bitmap, new Matrix(), paint); //设置上面一个ImageView的位图 iv.setImageBitmap(copyBitmap); //为ImageView添加触摸事件 iv.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_MOVE: for (int i = -7; i < 7; i++) { for (int j = -7; j < 7; j++) { //绘制圆形 if (Math.sqrt(i * i + j * j) < 7) { try { //绘制像素点,颜色为透明 copyBitmap.setPixel((int) event.getX() + i, (int) event.getY() + j, Color.TRANSPARENT); iv.setImageBitmap(copyBitmap); } catch (Exception e) { } } } } break; } return true; } }); } }