android开发步步为营之96:android两种常用截图技术
来源:互联网 发布:知错悔改的诗句 编辑:程序博客网 时间:2024/04/29 00:57
最近的一个需求是给系统换背景图后,能将换背景图的效果图展示给用户看,那么就需要用到截图技术,通过查阅相关资料,常用的截图技术主要有两种:一、通过view.getDrawingCache()截图。二、通过view.draw(canvas)截图。不管通过哪种方法,这个view可以是整个页面的view,也可以是单个button或者textview。好给出这个简单的demo
package com.figo.study.activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.DisplayMetrics;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;import com.figo.study.R;import com.figo.study.utils.CommonUtil;import java.io.File;import java.io.FileOutputStream;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Locale;public class CropScreenActivity extends AppCompatActivity { private Button mBtnCrop; private ImageView mImgScreen; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_crop_screen); mImgScreen = (ImageView) findViewById(R.id.img_screen); mBtnCrop = (Button) findViewById(R.id.btn_crop); mBtnCrop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss", Locale.US); File dir = getApplication().getDir("screencrop", Context.MODE_PRIVATE); String fname = dir.getAbsolutePath() + sdf.format(new Date()) + ".png"; View view = v.getRootView();//这里是截全屏 DisplayMetrics dm = getApplication().getResources().getDisplayMetrics(); int screenHeight = dm.heightPixels; int scrennWidth = dm.widthPixels; int imgHeight = CommonUtil.dp2px(200, CropScreenActivity.this); //第一种 通过view.getDrawingCache()截图// view.setDrawingCacheEnabled(true);// view.buildDrawingCache();// Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());// view.setDrawingCacheEnabled(false); //第二种 通过view.draw(canvas)截图 Bitmap bitmap = Bitmap.createBitmap(scrennWidth, screenHeight, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); view.draw(canvas); if (bitmap != null) { //保存截图 try { FileOutputStream out = new FileOutputStream(fname); bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } bitmap = Bitmap.createBitmap(bitmap, 0, screenHeight - imgHeight, scrennWidth, imgHeight); mImgScreen.setImageBitmap(bitmap); //从文件中读取// Bitmap bitmap1=BitmapFactory.decodeFile(fname);// mImgScreen.setImageBitmap(bitmap1); } else { Toast.makeText(CropScreenActivity.this, "not support", Toast.LENGTH_SHORT).show(); } } }); }}ps:注意不要在子线程去执行上面的操作,不然会报这个错误:
Only the original thread that created a view hierarchy can touch its views.
不能在子线程去操作主线程的视图。
1 0
- android开发步步为营之96:android两种常用截图技术
- android开发步步为营之91:自定义AlertDialog
- android开发步步为营之90:android图片处理技术之三(Gradient渐变图片的绘制)
- android开发步步为营之97:几种常用的android图片内存优化方法避免OOM
- android开发步步为营之88:基于LruCache和AsyncTask的网络相册开发
- android开发步步为营之95:自定义dialog去掉白色边框
- android开发步步为营之99:使用自定义字体
- android开发步步为营之108:下载断点续传
- android开发步步为营之94:使用PathEffect画虚线和虚线框
- android开发步步为营之105:解决键盘弹起页面被顶上去问题
- android开发步步为营之106:TextView,EditText要求固定行数自动调整TextSize
- android开发步步为营之86:关于对阿拉伯语页面文字从右往左的支持
- android开发步步为营之87:从sdcard或者data文件夹下读写数据
- android开发步步为营之104:文字加阴影效果和描边效果的实现
- android开发步步为营之93:android自定义view开发之一(验证码生成器)
- android开发步步为营之63:webview常用用法
- android开发步步为营之92:ViewPager+TabLayout+Fragment构造带标签的可左右滑动页面
- android开发步步为营之73:Android开发常见问题技术点总结之二
- 位图引起的内存溢出OutOfMemory解决方案
- Java并发编程:线程池的使用
- gradle多工程打包冲突问题
- 三目运算符
- linux和windows的进程的虚拟地址空间
- android开发步步为营之96:android两种常用截图技术
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
- 策略模式-Duck的例子
- zabbix3.0安装
- 报错 function refid '%d' does not reference a Lua function
- PowerDesigner 表名、字段大小写转换
- 当create table as select 遇上大数据
- Java并发编程:Callable、Future和FutureTask
- 关于一些基础的Java问题的解答(二)