你们好,又到了新的一期项目需求分析。台下的观众举起手,让我看到大家。javascript
欢迎各位点个star哦。(⊙o⊙)
java
这个也是具体项目中遇到的项目需求:须要在一个特定的界面中(都是图表和各类数据,可能需求分享给别人,告诉别人这个数据怎么怎么,这个图表怎么怎么)
因此给咱们开发的需求就是:android
功能上来讲,其实没啥难度。各类第三方的,别人写好的涂鸦封装包也有不少。可是要么是不能随意定制化,要么就是写的也不是特别好,并且我更加提倡的是技术自己不是特别好的各位同僚们,仍是宁肯下载下来观看,而后本身试着去写一下,写一个本身的工具。可能写的没别人好,可能有点重复造轮子的意思,可是对于本身的提高仍是很大的。固然你们能够提出意见。我写的也不见得很好。。(大牛请忽略这段话。哈哈)git
由于当前我作的是截屏后把得到的Bitmap保存为本地图片,而后跳转到涂鸦界面,而后打开这个本地图片进行涂鸦处理。其余人能够根据本身的需求对这个截屏获取的Bitmap进行处理。github
/** * 截屏并将图片保存到相应路径下 * @param activity 当前须要截屏的activity * @param path 图片保存路径 */
public static void SaveScreenShot(Activity activity,String path) {
View view = activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(path);
bitmap.compress(Bitmap.CompressFormat.PNG,100,outputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
if(outputStream != null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
view.setDrawingCacheEnabled(false);
}
}复制代码
核心的代码就是:canvas
View view = activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
view.setDrawingCacheEnabled(false);复制代码
核心的概念就是:自定义View(画板),而后在上面先画上咱们截屏的图片,而后再在上面画上一层图片,咱们的涂鸦其实也就是在上面一层图片画来画去。一脸懵逼?? 必定要逼我换个通俗易懂的???微信
好比画板是一个桌子,咱们先在上面放了一个海报,而后咱们再拿一个透明的图片(这里好比咱们拿的是一块透明玻璃)盖在海报上面,而后咱们拿个粉笔在玻璃上面画来画去,这时候来咱们看来,是否是就等于海报被涂了各类颜色。好比咱们要清空涂鸦。是否是只要把玻璃上面的涂鸦给擦光就好了。而后下面的海报就又变成了原来的样子。app
因此咱们这个涂鸦也要一步步来处理,由于在实际开发中会遇到各类问题,因此要一步步来。ide
可能有人要问了。为啥要等比例放进去,咱们就直接把图片塞进去咱们的画板不就OK了吗。
由于咱们此次是全屏截图!!!而咱们的画板确定是比全屏的截图面积要小,由于下面有画笔、橡皮擦等其余功能菜单区域。
看效果(我故意把个人涂鸦画板的高度设置小不少):
工具
也有可能有人要问,若是个人需求不是截屏涂鸦,是打开内置的某个图片,而后画板反而比个人图片大怎么办
。不要紧。这里教大家一招。不用在乎图片跟画板哪一个大哪一个小。
1.获取图片的宽和高:bitmapWidth,bitmapHeight
2.获取画板的宽和高:boardWidth,boardHeight
3.若是bitmapWidth > boardWidth或者 bitmapHeight > boardHeight,则把图片缩小比例,来适应画板
4.不然就设置画板控件的宽和高等于图片的宽和高。既让boardWidth = bitmapWidth,boardHeight = bitmapHeight。咱们反过来让画板来适应图片便可。
/** * * 图片过大则根据容器把原始图片改变大小。从而适应容器。 * 不然改变画板大小适应图片 * * @param bitmap * @param boardView * @return */
public static Bitmap resizeBitmap(Bitmap bitmap, View boardView) {
int bitmapHeight = bitmap.getHeight();
int bitmapWidth = bitmap.getWidth();
int boardHeight = boardView.getHeight();
int boardWidth = boardView.getWidth();
float scale = 1f;
if(bitmapHeight > boardHeight || bitmapWidth > boardWidth){
scale = bitmapHeight > bitmapWidth
? boardHeight / (bitmapHeight * 1f)
: boardWidth / (bitmapWidth * 1f);
}
Matrix matrix = new Matrix();
matrix.postScale(scale, scale);
Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmapWidth, bitmapHeight, matrix, false);
ViewGroup.LayoutParams params = boardView.getLayoutParams();
params.height = resizeBitmap.getHeight();
params.width = resizeBitmap.getWidth();
boardView .setLayoutParams(params);
return resizeBitmap;
}复制代码
咱们上面拿到了截图的Bitmap,咱们画上去后,还要画一层用于涂鸦的Bitmap,也就是我前面举例的那块透明玻璃。
也很简单。咱们只要再新建一个Bitmap,大小等同于画板的大小,而后用Canvas包裹,让这个Bitmap可以具备画画的功能,
而后再把这个新的Bitmap让咱们的画板画出来就能够了。
咱们在自定义View 中写入一个方法:
/** * 设置背景图片及监理新的用来涂鸦的Bitmap * * @param bitmap 传入的截图界面图片 */
public void setBackgroud(Bitmap bitmap) {
this.backgroudBitmap = bitmap;
this.bitmap = Bitmap.createBitmap(backgroudBitmap.getWidth(), backgroudBitmap.getHeight(), Bitmap.Config.ARGB_8888);
paintCanvas = new Canvas(this.bitmap);
}复制代码
这样咱们把第一步处理好的截图图片传进来的时候。同时建一个和这个截图图片同样大小的图片,而且用Canvas包裹。这样等会咱们就能够用这个paintCanvas在新的图片上面进行画画了。
咱们在onDraw方法中也只要画这二个Bitmap就能够了。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (backgroudBitmap != null && !backgroudBitmap.isRecycled()) {
canvas.drawBitmap(backgroudBitmap, 0, 0, null);
}
if (bitmap != null && !bitmap.isRecycled()) {
canvas.drawBitmap(bitmap, 0, 0, null);
}
}复制代码
真正的涂鸦功能,其实只是对咱们的后面新建的Bitmap进行各类操做,也就是用上面的paintCanvas来进行画线等操做。
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = event.getX();
startY = event.getY();
path = new Path();
path.moveTo(startX, startY);
break;
case MotionEvent.ACTION_MOVE:
endX = event.getX();
endY = event.getY();
path.quadTo(startX, startY, endX, endY);
paintCanvas.drawPath(path, isEraser ? eraserPaint : paint);
startX = endX;
startY = endY;
postInvalidate();
break;
case MotionEvent.ACTION_UP:
drawPathList.add(new DrawPathEntry(path, isEraser ? eraserPaint.getColor() : paint.getColor(), isEraser));
break;
default:
break;
}
return true;
}复制代码
其实用不一样颜色画笔来画,就是单纯的切换Paint的颜色值便可。
/** * 设置画笔颜色及橡皮擦 * * @param type */
public void setPaintType(int type) {
isEraser = false;
switch (type) {
case AnnotationConfig.PaintType.Paint_Red:
paint.setColor(ContextCompat.getColor(context, R.color.red_radio));
break;
case AnnotationConfig.PaintType.Paint_Orange:
paint.setColor(ContextCompat.getColor(context, R.color.orange_radio));
break;
case AnnotationConfig.PaintType.Paint_Yellow:
paint.setColor(ContextCompat.getColor(context, R.color.yellow_radio));
break;
case AnnotationConfig.PaintType.Paint_Green:
paint.setColor(ContextCompat.getColor(context, R.color.green_radio));
break;
case AnnotationConfig.PaintType.Paint_Blue:
paint.setColor(ContextCompat.getColor(context, R.color.blue_radio));
break;
case AnnotationConfig.PaintType.Paint_Purple:
paint.setColor(ContextCompat.getColor(context, R.color.purple_radio));
break;
case AnnotationConfig.PaintType.Paint_Eraser:
isEraser = true;
break;
default:
break;
}
}复制代码
其实橡皮擦功能,你能够理解就是在画一个透明的线,这个线盖在了你的其余的画好的线的上面。咱们的目标就是他们二个交集的地方,让本来的线消失。
下表就是二个线交集的时候,不一样Mode下呈现的状况。咱们这里就能够用Clear模式。交集的地方,让底下的颜色消失就能够。
Xfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);
eraserPaint.setXfermode(xfermode);复制代码
而后让这个earserPaint按照上面涂鸦的写法,让它画线就能够。
撤销其实也很简单,就是咱们在画的时候,把每次画的Path和所画这个Path的画笔颜色保存下来,放在一个List集合里面,而后每次点撤销,就把List集合里面最后一个的Path给去掉,而后把二层Bitmap(也就是那个透明玻璃)清空,再把List里面的全部的Path按照其对应的画笔颜色画出来就能够了。
/** * 撤销操做 */
public void cancelPath() {
if (drawPathList != null && drawPathList.size() <= 0) {
return;
}
drawPathList.remove(drawPathList.size() - 1);
paintCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
for (DrawPathEntry entry : drawPathList) {
paint.setColor(entry.getPaintColor());
paintCanvas.drawPath(entry.getPath(), entry.isEraser() ? eraserPaint : paint);
}
postInvalidate();
}复制代码
清空涂鸦就比上面撤销功能更简单了。把二层Bitmap(也就是那个透明玻璃)清空,而后把咱们的上面存Path的List给清空,这样撤销也就不会出现原来的涂鸦。
/** * 清空涂鸦 */
public void clearScrawlBoard() {
paintCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
drawPathList.clear();
postInvalidate();
}复制代码
新建一个Canvas。把最终的截图图片的bitmap和最终已经涂鸦好的二层Bitmap(透明玻璃)给画上去,而后获取最终的合成的Bitmap便可。
/** * @return 返回最终的涂鸦好的图片 */
public Bitmap getSrawBoardBitmap() {
Bitmap resultBitmap = Bitmap.createBitmap(backgroudBitmap.getWidth(), backgroudBitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(resultBitmap);
canvas.drawBitmap(backgroudBitmap, 0, 0, null);
canvas.drawBitmap(bitmap, 0, 0, null);
canvas.save();
return resultBitmap;
}复制代码
咱们经过上面的getSrawBoardBitmap()
方法得到了最后的合成的图片。而后分享到微信,QQ等第三方软件。我这边用的是友盟分享。
它只是帮你作了个封装,而各个第三方的分享都要去其相应的平台去申请Key。
好比你要分享到微信和QQ,就要分别取申请微信和QQ的key。而后再集成到友盟分享中去,才能使用。
UMImage image = new UMImage(DrawBaseActivity.this, bit);
new ShareAction(DrawBaseActivity.this).withText("hello").withMedia(image)
.setDisplayList(SHARE_MEDIA.QQ,SHARE_MEDIA.WEIXIN,SHARE_MEDIA.ALIPAY)
.setCallback(new UMShareListener() {
@Override
public void onStart(SHARE_MEDIA share_media) {
}
@Override
public void onResult(SHARE_MEDIA share_media) {
Toast.makeText(DrawBaseActivity.this, share_media + " 分享成功啦", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(SHARE_MEDIA share_media, Throwable throwable) {
Toast.makeText(DrawBaseActivity.this,share_media + " 分享失败啦", Toast.LENGTH_SHORT).show();
if(throwable!=null){
Log.d("throw","throw:"+throwable.getMessage());
}
}
@Override
public void onCancel(SHARE_MEDIA share_media) {
Toast.makeText(DrawBaseActivity.this,share_media + " 分享取消了", Toast.LENGTH_SHORT).show();
}
}).open();复制代码
最后的最后,贴上相应的相关自定义View和涂鸦的所属的Activity的代码。你们也能够去我上面贴的Github地址中取下载demo。更方便查看:截屏及仿支付宝涂鸦功能
package com.example.scrawldemo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.IdRes;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.RadioGroup;
import android.widget.Toast;
import com.example.scrawldemo.config.AnnotationConfig;
import com.example.scrawldemo.util.BitmapUtil;
import com.example.scrawldemo.widget.ScrawlBoardView;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class ScrawlActivity extends AppCompatActivity {
@BindView(R.id.color_group)
RadioGroup colorGroup;
@BindView(R.id.board_view)
ScrawlBoardView boardView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
String path = getIntent().getStringExtra("path");
final Bitmap bitmap = BitmapFactory.decodeFile(path);
boardView.post(new Runnable() {
@Override
public void run() {
final Bitmap resizeBitmap = BitmapUtil.resizeBitmap(bitmap,boardView);
//final Bitmap resizeBitmap = bitmap;
runOnUiThread(new Runnable() {
@Override
public void run() {
boardView.setBackgroud(resizeBitmap);
}
});
}
});
colorGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) {
switch (checkedId) {
case R.id.red_radio:
boardView.setPaintType(AnnotationConfig.PaintType.Paint_Red);
break;
case R.id.orange_radio:
boardView.setPaintType(AnnotationConfig.PaintType.Paint_Orange);
break;
case R.id.yellow_radio:
boardView.setPaintType(AnnotationConfig.PaintType.Paint_Yellow);
break;
case R.id.green_radio:
boardView.setPaintType(AnnotationConfig.PaintType.Paint_Green);
break;
case R.id.blue_radio:
boardView.setPaintType(AnnotationConfig.PaintType.Paint_Blue);
break;
case R.id.purple_radio:
boardView.setPaintType(AnnotationConfig.PaintType.Paint_Purple);
break;
case R.id.eraser_radio:
boardView.setPaintType(AnnotationConfig.PaintType.Paint_Eraser);
break;
default:
break;
}
}
});
}
@OnClick({R.id.cancel, R.id.rubbish,R.id.finish_btn,R.id.send_btn})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.cancel:
boardView.cancelPath();
break;
case R.id.rubbish:
boardView.clearScrawlBoard();
break;
case R.id.finish_btn:
finish();
break;
case R.id.send_btn:
Bitmap bitmap = boardView.getSrawBoardBitmap();
//该处的bitmap是涂鸦好的图片。
//该例子中是把涂鸦好的图片保存到本地
try {
FileOutputStream outputStream = new FileOutputStream(ScrawlActivity.this.getExternalFilesDir(Environment.DIRECTORY_PICTURES)+"/ChintScreenShot.png");
bitmap.compress(Bitmap.CompressFormat.PNG,100,outputStream);
Toast.makeText(this, "保存到本地成功", Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//我分享用的是友盟分享。也就是把上面获取到的bitmap传入到相应的友盟分享中的方法便可
/* UMImage image = new UMImage(ScrawlActivity.this, bitmap); new ShareAction(DrawBaseActivity.this).withText("hello").withMedia(image) .setDisplayList(SHARE_MEDIA.QQ,SHARE_MEDIA.WEIXIN,SHARE_MEDIA.ALIPAY) .setCallback(new UMShareListener() { @Override public void onStart(SHARE_MEDIA share_media) { } @Override public void onResult(SHARE_MEDIA share_media) { Toast.makeText(DrawBaseActivity.this, share_media + " 分享成功啦", Toast.LENGTH_SHORT).show(); } @Override public void onError(SHARE_MEDIA share_media, Throwable throwable) { Toast.makeText(DrawBaseActivity.this,share_media + " 分享失败啦", Toast.LENGTH_SHORT).show(); if(throwable!=null){ Log.d("throw","throw:"+throwable.getMessage()); } } @Override public void onCancel(SHARE_MEDIA share_media) { Toast.makeText(DrawBaseActivity.this,share_media + " 分享取消了", Toast.LENGTH_SHORT).show(); } }).open(); */
break;
default:
break;
}
}
}复制代码
package com.example.scrawldemo.widget;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Xfermode;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import com.example.scrawldemo.R;
import com.example.scrawldemo.bean.DrawPathEntry;
import com.example.scrawldemo.config.AnnotationConfig;
import java.util.ArrayList;
import java.util.List;
/** * Project:AndroidDemo * Author:dyping * Date:2017/4/11 10:36 */
public class ScrawlBoardView extends View {
Canvas paintCanvas;
Paint paint, eraserPaint;
Bitmap bitmap;
Bitmap backgroudBitmap;
float startX, startY, endX, endY;
Context context;
boolean isEraser;
List<DrawPathEntry> drawPathList = new ArrayList<>();
Path path;
public ScrawlBoardView(Context context) {
super(context);
}
public ScrawlBoardView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);
paint.setDither(true);
paint.setFilterBitmap(true);
paint.setColor(ContextCompat.getColor(context, R.color.red_radio));
paint.setStrokeWidth(10);
eraserPaint = new Paint();
eraserPaint.setStyle(Paint.Style.STROKE);
eraserPaint.setStrokeWidth(20);
eraserPaint.setColor(Color.TRANSPARENT);
Xfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);
eraserPaint.setXfermode(xfermode);
this.context = context;
}
public ScrawlBoardView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (backgroudBitmap != null && !backgroudBitmap.isRecycled()) {
canvas.drawBitmap(backgroudBitmap, 0, 0, null);
}
if (bitmap != null && !bitmap.isRecycled()) {
canvas.drawBitmap(bitmap, 0, 0, null);
}
}
/** * 设置背景图片及监理新的用来涂鸦的Bitmap * * @param bitmap 传入的截图界面图片 */
public void setBackgroud(Bitmap bitmap) {
this.backgroudBitmap = bitmap;
this.bitmap = Bitmap.createBitmap(backgroudBitmap.getWidth(), backgroudBitmap.getHeight(), Bitmap.Config.ARGB_8888);
paintCanvas = new Canvas(this.bitmap);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = event.getX();
startY = event.getY();
path = new Path();
path.moveTo(startX, startY);
break;
case MotionEvent.ACTION_MOVE:
endX = event.getX();
endY = event.getY();
path.quadTo(startX, startY, endX, endY);
paintCanvas.drawPath(path, isEraser ? eraserPaint : paint);
startX = endX;
startY = endY;
postInvalidate();
break;
case MotionEvent.ACTION_UP:
drawPathList.add(new DrawPathEntry(path, isEraser ? eraserPaint.getColor() : paint.getColor(), isEraser));
break;
default:
break;
}
return true;
}
/** * 设置画笔颜色及橡皮擦 * * @param type */
public void setPaintType(int type) {
isEraser = false;
switch (type) {
case AnnotationConfig.PaintType.Paint_Red:
paint.setColor(ContextCompat.getColor(context, R.color.red_radio));
break;
case AnnotationConfig.PaintType.Paint_Orange:
paint.setColor(ContextCompat.getColor(context, R.color.orange_radio));
break;
case AnnotationConfig.PaintType.Paint_Yellow:
paint.setColor(ContextCompat.getColor(context, R.color.yellow_radio));
break;
case AnnotationConfig.PaintType.Paint_Green:
paint.setColor(ContextCompat.getColor(context, R.color.green_radio));
break;
case AnnotationConfig.PaintType.Paint_Blue:
paint.setColor(ContextCompat.getColor(context, R.color.blue_radio));
break;
case AnnotationConfig.PaintType.Paint_Purple:
paint.setColor(ContextCompat.getColor(context, R.color.purple_radio));
break;
case AnnotationConfig.PaintType.Paint_Eraser:
isEraser = true;
break;
default:
break;
}
}
/** * 撤销操做 */
public void cancelPath() {
if (drawPathList != null && drawPathList.size() <= 0) {
return;
}
drawPathList.remove(drawPathList.size() - 1);
paintCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
for (DrawPathEntry entry : drawPathList) {
paint.setColor(entry.getPaintColor());
paintCanvas.drawPath(entry.getPath(), entry.isEraser() ? eraserPaint : paint);
}
postInvalidate();
}
/** * 清空涂鸦 */
public void clearScrawlBoard() {
paintCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
drawPathList.clear();
postInvalidate();
}
/** * @return 返回最终的涂鸦好的图片 */
public Bitmap getSrawBoardBitmap() {
Bitmap resultBitmap = Bitmap.createBitmap(backgroudBitmap.getWidth(), backgroudBitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(resultBitmap);
canvas.drawBitmap(backgroudBitmap, 0, 0, null);
canvas.drawBitmap(bitmap, 0, 0, null);
canvas.save();
return resultBitmap;
}
}复制代码
package com.example.scrawldemo.util;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.view.View;
import android.view.ViewGroup;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/** * Project:AndroidDemo * Author:dyping * Date:2017/4/11 10:40 */
public class BitmapUtil {
/** * * 图片过大则根据容器把原始图片改变大小。从而适应容器。 * 不然改变画板大小适应图片 * * @param bitmap * @param boardView * @return */
public static Bitmap resizeBitmap(Bitmap bitmap, View boardView) {
int bitmapHeight = bitmap.getHeight();
int bitmapWidth = bitmap.getWidth();
int boardHeight = boardView.getHeight();
int boardWidth = boardView.getWidth();
float scale = 1f;
if(bitmapHeight > boardHeight || bitmapWidth > boardWidth){
scale = bitmapHeight > bitmapWidth
? boardHeight / (bitmapHeight * 1f)
: boardWidth / (bitmapWidth * 1f);
}
Matrix matrix = new Matrix();
matrix.postScale(scale, scale);
Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmapWidth, bitmapHeight, matrix, false);
ViewGroup.LayoutParams params = boardView.getLayoutParams();
params.height = resizeBitmap.getHeight();
params.width = resizeBitmap.getWidth();
boardView .setLayoutParams(params);
return resizeBitmap;
}
/** * 截屏并将图片保存到相应路径下 * * @param activity 当前须要截屏的activity * @param path 图片保存路径 */
public static void SaveScreenShot(Activity activity, String path) {
View view = activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(path);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
view.setDrawingCacheEnabled(false);
}
}
}复制代码