手机截图怎么涂鸦,然后涂鸦了,谁能帮我恢复,能看到字就行,

截图中怎么涂鸦 想要把截图中的一部分勾画上,但是我不会。高人指点。让我学会的,给你最佳_百度宝宝知道怎么才能让手机截图涂鸦部分恢复原来的文字图片_百度知道
怎么才能让手机截图涂鸦部分恢复原来的文字图片
我有更好的答案
你可以传图上来看下
VpnVip资讯教程,软件使用平台。
操作系统/系统故障
这个办不到,除非你有未被涂鸦过的图片,才能用ps处理
你好,新增图层保存后是不易改回。建议上某宝上面找专业人士试试。
来自:求助得到的回答
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。怎样去除微信截图的涂鸦,恢复原来字_百度知道
怎样去除微信截图的涂鸦,恢复原来字
怎样去除微信截图的涂鸦,恢复原来字
我有更好的答案
涂鸦这个基本和马赛克相差不大,不管是微信截图还是别的图片上的涂鸦,这个已经图层合并到一起,包括电脑最强大的PS也是无法处理,即使处理也不是原来的图像细节。
先将微信图片保存到手机,然后再使用涂鸦软件就可以了。
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。有哪些鲜为人知,但是很有意思的网站? - 知乎<strong class="NumberBoard-itemValue" title="8被浏览<strong class="NumberBoard-itemValue" title=",015,160分享邀请回答airpano.ru/注意,网络会加载很久,电脑可能会很卡哟~搭配上当地的民族乐曲,我仿佛感觉我已经到过了这里。5,公式字符化网站。你还在苦恼复杂的数学公式和化学方程式没办法用电脑打出来吗?!有了这个神器,你就可以轻松地以手绘的方式画出来,交给电脑自动帮你转化哟!知乎上的各位,你们心动了没?!不仅是工科生,连美术和音乐的学生也能用到!6,让你画出特别线条的网站。还在为自己没有艺术天分发愁么?来用用这个,我们只要特别!画了一只刘看山~~7,帮你入眠,帮你安静的网站还在为睡不着烦恼么?还在为没有氛围没有灵感而苦恼么?来吧,让我们在雷雨声中,享受别样的宁静!这个网站同样出了APP,但是要收费。其实你只要用手机里的浏览器打开这个网站,就可以免费听到雨声了!!嗯。今天就到这里啦!再见吧!32K771 条评论分享收藏感谢收起fakeupdate.net/这个网站有点厉害,让你假装各种操作系统正在更新,而且实时进度,配合全屏简直了,我永远没法忘记当同事看到我的 Mac 系统显示正在安装 Windows 98 时候的惊讶表情,仿佛再说:卧槽!!(PS:悄悄告诉你们,当你上班想偷懒的时候,这个界面一打开,全屏,老板看到了都拿你没办法,嘘,别扩散!)1.2K63 条评论分享收藏感谢收起&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
项目需求讨论:截图&涂鸦&分享
摘要:大家好,又到了新的一期项目需求分析。台下的观众举起手,让我看到你们。同时我已经上传该项目:截屏及仿支付宝涂鸦功能欢迎各位点个star哦。(⊙o⊙)开始秋名山飘移之路这个也是具体项目中遇到的项目需求:需要在一个特定的界面中(都是图表和各种数据,可能需求分享给别人,告诉别人这个数据怎么怎么,这个图表怎么怎么)所以给我们开发的需求就是:对该界面进行截屏截屏后跳到涂鸦界面,可能某个数据圈出来,让别人一看就知道。(涂鸦,橡皮擦,撤销,清空操作)分享给QQ,微信等等其他第三方软件。功能上
大家好,又到了新的一期项目需求分析。台下的观众举起手,让我看到你们。
同时我已经上传该项目:截屏及仿支付宝涂鸦功能
欢迎各位点个star哦。(⊙o⊙)
开始秋名山飘移之路
这个也是具体项目中遇到的项目需求:需要在一个特定的界面中(都是图表和各种数据,可能需求分享给别人,告诉别人这个数据怎么怎么,这个图表怎么怎么)所以给我们开发的需求就是:
对该界面进行截屏
截屏后跳到涂鸦界面,可能某个数据圈出来,让别人一看就知道。(涂鸦,橡皮擦,撤销,清空操作)
分享给QQ,微信等等其他第三方软件。
功能上来说,其实没啥难度。各种第三方的,别人写好的涂鸦封装包也有很多。但是要么是不能随意定制化,要么就是写的也不是特别好,而且我更加提倡的是技术本身不是特别好的各位同僚们,还是宁可下载下来观看,然后自己试着去写一下,写一个自己的工具。可能写的没别人好,可能有点重复造轮子的意思,但是对于自己的提升还是很大的。当然大家可以提出意见。我写的也不见得很好。。(大牛请忽略这段话。哈哈)
1.界面截屏功能
因为当前我做的是截屏后把获得的Bitmap保存为本地图片,然后跳转到涂鸦界面,然后打开这个本地图片进行涂鸦处理。其他人可以根据自己的需求对这个截屏获取的Bitmap进行处理。
* 截屏并将图片保存到相应路径下
* @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 =
outputStream = new FileOutputStream(path);
bitmap.compress(Bitmap.CompressFormat.PNG,100,outputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
if(outputStream != null){
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
view.setDrawingCacheEnabled(false);
核心的代码就是:
View view = activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
view.setDrawingCacheEnabled(false);
2.涂鸦功能
核心的概念就是:自定义View(画板),然后在上面先画上我们截屏的图片,然后再在上面画上一层图片,我们的涂鸦其实也就是在上面一层图片画来画去。一脸懵逼?? 一定要逼我换个通俗易懂的???
比如画板是一个桌子,我们先在上面放了一个海报,然后我们再拿一个透明的图片(这里比如我们拿的是一块透明玻璃)盖在海报上面,然后我们拿个粉笔在玻璃上面画来画去,这时候来我们看来,是不是就等于海报被涂了各种颜色。比如我们要清空涂鸦。是不是只要把玻璃上面的涂鸦给擦光就行了。然后下面的海报就又变成了原来的样子。
所以我们这个涂鸦也要一步步来处理,因为在实际开发中会遇到各种问题,所以要一步步来。
如何把截图的图片,按照我们自定义的View(画板)的大小,等比例放进去。
可能有人要问了。为啥要等比例放进去,我们就直接把图片塞进去我们的画板不就OK了吗。 因为我们这次是全屏截图!!!而我们的画板肯定是比全屏的截图面积要小,因为下面有画笔、橡皮擦等其他功能菜单区域。 看效果(我故意把我的涂鸦画板的高度设置小很多):
所要截图的界面
截图不做调整直接放入
截图做了调整放入
这下大家懂了吧
OK,我们接下去就知道了。如果我们要在自定义的View(画板)上先放上去截图的图片,就要先把图片按比例处理好再放入。所以也就是说这个图片需要根据我们的画板的面积来做相应调整。
也有可能有人要问,如果我的需求不是截屏涂鸦,是打开内置的某个图片,然后画板反而比我的图片大怎么办。没关系。这里教你们一招。不用在意图片跟画板哪个大哪个小。
1.获取图片的宽和高:bitmapWidth,bitmapHeight 2.获取画板的宽和高:boardWidth,boardHeight 3.如果bitmapWidth & boardWidth或者 bitmapHeight & boardHeight,则把图片缩小比例,来适应画板 4.否则就设置画板控件的宽和高等于图片的宽和高。既让boardWidth = bitmapWidth,boardHeight = bitmapHeight。我们反过来让画板来适应图片即可。
* 图片过大则根据容器把原始图片改变大小。从而适应容器。
* 否则改变画板大小适应图片
* @param bitmap
* @param boardView
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 resizeB
添加第二层Canvas。用于涂鸦
我们上面拿到了截图的Bitmap,我们画上去后,还要画一层用于涂鸦的Bitmap,也就是我前面举例的那块透明玻璃。也很简单。我们只要再新建一个Bitmap,大小等同于画板的大小,然后用Canvas包裹,让这个Bitmap能够具有画画的功能,然后再把这个新的Bitmap让我们的画板画出来就可以了。我们在自定义View 中写入一个方法:
* 设置背景图片及监理新的用来涂鸦的Bitmap
* @param bitmap 传入的截图界面图片
public void setBackgroud(Bitmap bitmap) {
this.backgroudBitmap =
this.bitmap = Bitmap.createBitmap(backgroudBitmap.getWidth(), backgroudBitmap.getHeight(), Bitmap.Config.ARGB_8888);
paintCanvas = new Canvas(this.bitmap);
这样我们把第一步处理好的截图图片传进来的时候。同时建一个和这个截图图片一样大小的图片,并且用Canvas包裹。这样等会我们就可以用这个paintCanvas在新的图片上面进行画画了。
我们在onDraw方法中也只要画这二个Bitmap就可以了。
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来进行画线等操作。
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);
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();
case MotionEvent.ACTION_UP:
drawPathList.add(new DrawPathEntry(path, isEraser ? eraserPaint.getColor() : paint.getColor(), isEraser));
切换涂鸦颜色功能
其实用不同颜色画笔来画,就是单纯的切换Paint的颜色值即可。
* 设置画笔颜色及橡皮擦
* @param type
public void setPaintType(int type) {
isEraser =
switch (type) {
case AnnotationConfig.PaintType.Paint_Red:
paint.setColor(ContextCompat.getColor(context, R.color.red_radio));
case AnnotationConfig.PaintType.Paint_Orange:
paint.setColor(ContextCompat.getColor(context, R.color.orange_radio));
case AnnotationConfig.PaintType.Paint_Yellow:
paint.setColor(ContextCompat.getColor(context, R.color.yellow_radio));
case AnnotationConfig.PaintType.Paint_Green:
paint.setColor(ContextCompat.getColor(context, R.color.green_radio));
case AnnotationConfig.PaintType.Paint_Blue:
paint.setColor(ContextCompat.getColor(context, R.color.blue_radio));
case AnnotationConfig.PaintType.Paint_Purple:
paint.setColor(ContextCompat.getColor(context, R.color.purple_radio));
case AnnotationConfig.PaintType.Paint_Eraser:
isEraser =
橡皮擦功能
其实橡皮擦功能,你可以理解就是在画一个透明的线,这个线盖在了你的其他的画好的线的上面。我们的目标就是他们二个交集的地方,让原本的线消失。下表就是二个线交集的时候,不同Mode下呈现的情况。我们这里就可以用Clear模式。交集的地方,让底下的颜色消失就可以。
设置橡皮擦的Paint的Xfermode模式为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) {
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 resultB
3.图片分享功能
我们通过上面的getSrawBoardBitmap()方法获得了最后的合成的图片。然后分享到微信,QQ等第三方软件。我这边用的是友盟分享。
友盟分享Android SDK
它只是帮你做了个封装,而各个第三方的分享都要去其相应的平台去申请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() {
public void onStart(SHARE_MEDIA share_media) {
public void onResult(SHARE_MEDIA share_media) {
Toast.makeText(DrawBaseActivity.this, share_media + & 分享成功啦&, Toast.LENGTH_SHORT).show();
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());
public void onCancel(SHARE_MEDIA share_media) {
Toast.makeText(DrawBaseActivity.this,share_media + & 分享取消了&, Toast.LENGTH_SHORT).show();
}).open();
最后的最后,贴上相应的相关自定义View和涂鸦的所属的Activity的代码。大家也可以去我上面贴的Github地址中取下载demo。更方便查看:截屏及仿支付宝涂鸦功能
ScrawlActivity.java
package com.example.
import android.graphics.B
import android.graphics.BitmapF
import android.os.B
import android.os.E
import android.support.annotation.IdR
import android.support.v7.app.AppCompatA
import android.view.V
import android.widget.RadioG
import android.widget.T
import com.example.scrawldemo.config.AnnotationC
import com.example.scrawldemo.util.BitmapU
import com.example.scrawldemo.widget.ScrawlBoardV
import java.io.FileNotFoundE
import java.io.FileOutputS
import butterknife.BindV
import butterknife.ButterK
import butterknife.OnC
public class ScrawlActivity extends AppCompatActivity {
@BindView(R.id.color_group)
RadioGroup colorG
@BindView(R.id.board_view)
ScrawlBoardView boardV
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() {
public void run() {
final Bitmap resizeBitmap = BitmapUtil.resizeBitmap(bitmap,boardView);
//final Bitmap resizeBitmap =
runOnUiThread(new Runnable() {
public void run() {
boardView.setBackgroud(resizeBitmap);
colorGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) {
switch (checkedId) {
case R.id.red_radio:
boardView.setPaintType(AnnotationConfig.PaintType.Paint_Red);
case R.id.orange_radio:
boardView.setPaintType(AnnotationConfig.PaintType.Paint_Orange);
case R.id.yellow_radio:
boardView.setPaintType(AnnotationConfig.PaintType.Paint_Yellow);
case R.id.green_radio:
boardView.setPaintType(AnnotationConfig.PaintType.Paint_Green);
case R.id.blue_radio:
boardView.setPaintType(AnnotationConfig.PaintType.Paint_Blue);
case R.id.purple_radio:
boardView.setPaintType(AnnotationConfig.PaintType.Paint_Purple);
case R.id.eraser_radio:
boardView.setPaintType(AnnotationConfig.PaintType.Paint_Eraser);
@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();
case R.id.rubbish:
boardView.clearScrawlBoard();
case R.id.finish_btn:
case R.id.send_btn:
Bitmap bitmap = boardView.getSrawBoardBitmap();
//该处的bitmap是涂鸦好的图片。
//该例子中是把涂鸦好的图片保存到本地
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() {
public void onStart(SHARE_MEDIA share_media) {
public void onResult(SHARE_MEDIA share_media) {
Toast.makeText(DrawBaseActivity.this, share_media + & 分享成功啦&, Toast.LENGTH_SHORT).show();
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());
public void onCancel(SHARE_MEDIA share_media) {
Toast.makeText(DrawBaseActivity.this,share_media + & 分享取消了&, Toast.LENGTH_SHORT).show();
}).open();
ScrawlBoardView.java
package com.example.scrawldemo.
import android.content.C
import android.graphics.B
import android.graphics.C
import android.graphics.C
import android.graphics.P
import android.graphics.P
import android.graphics.PorterD
import android.graphics.PorterDuffX
import android.graphics.X
import android.support.annotation.N
import android.support.v4.content.ContextC
import android.util.AttributeS
import android.view.MotionE
import android.view.V
import com.example.scrawldemo.R;
import com.example.scrawldemo.bean.DrawPathE
import com.example.scrawldemo.config.AnnotationC
import java.util.ArrayL
import java.util.L
* Project:AndroidDemo
* Author:dyping
* Date: 10:36
public class ScrawlBoardView extends View {
Canvas paintC
Paint paint, eraserP
Bitmap backgroudB
float startX, startY, endX, endY;
boolean isE
List&DrawPathEntry& drawPathList = new ArrayList&&();
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 =
public ScrawlBoardView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
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 =
this.bitmap = Bitmap.createBitmap(backgroudBitmap.getWidth(), backgroudBitmap.getHeight(), Bitmap.Config.ARGB_8888);
paintCanvas = new Canvas(this.bitmap);
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);
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();
case MotionEvent.ACTION_UP:
drawPathList.add(new DrawPathEntry(path, isEraser ? eraserPaint.getColor() : paint.getColor(), isEraser));
* 设置画笔颜色及橡皮擦
* @param type
public void setPaintType(int type) {
isEraser =
switch (type) {
case AnnotationConfig.PaintType.Paint_Red:
paint.setColor(ContextCompat.getColor(context, R.color.red_radio));
case AnnotationConfig.PaintType.Paint_Orange:
paint.setColor(ContextCompat.getColor(context, R.color.orange_radio));
case AnnotationConfig.PaintType.Paint_Yellow:
paint.setColor(ContextCompat.getColor(context, R.color.yellow_radio));
case AnnotationConfig.PaintType.Paint_Green:
paint.setColor(ContextCompat.getColor(context, R.color.green_radio));
case AnnotationConfig.PaintType.Paint_Blue:
paint.setColor(ContextCompat.getColor(context, R.color.blue_radio));
case AnnotationConfig.PaintType.Paint_Purple:
paint.setColor(ContextCompat.getColor(context, R.color.purple_radio));
case AnnotationConfig.PaintType.Paint_Eraser:
isEraser =
* 撤销操作
public void cancelPath() {
if (drawPathList != null &;&; drawPathList.size() &= 0) {
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 resultB
BitmapUtil.java
package com.example.scrawldemo.
import android.app.A
import android.graphics.B
import android.graphics.M
import android.view.V
import android.view.ViewG
import java.io.FileNotFoundE
import java.io.FileOutputS
import java.io.IOE
* Project:AndroidDemo
* Author:dyping
* Date: 10:40
public class BitmapUtil {
* 图片过大则根据容器把原始图片改变大小。从而适应容器。
* 否则改变画板大小适应图片
* @param bitmap
* @param boardView
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 resizeB
* 截屏并将图片保存到相应路径下
* @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 =
outputStream = new FileOutputStream(path);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
view.setDrawingCacheEnabled(false);
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
项目需求讨论:截图&涂鸦&分享相关信息,包括
的信息,所有项目需求讨论:截图&涂鸦&分享相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International

我要回帖

更多关于 qq截图涂鸦 的文章

 

随机推荐