android开发步步为营之96:android两种常用截图技术
2016-03-16 16:09
330 查看
最近的一个需求是给系统换背景图后,能将换背景图的效果图展示给用户看,那么就需要用到截图技术,通过查阅相关资料,常用的截图技术主要有两种:一、通过view.getDrawingCache()截图。二、通过view.draw(canvas)截图。不管通过哪种方法,这个view可以是整个页面的view,也可以是单个button或者textview。好给出这个简单的demo
Only the original thread that created a view hierarchy can touch its views.
不能在子线程去操作主线程的视图。
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.
不能在子线程去操作主线程的视图。
相关文章推荐
- Android进程优先级architecture : low memory killer (/system/core/lmkd/lmkd.c)
- Android 单位转换(dp、sp、px)
- Android模仿表单上传文件
- android上传图片(及普通参数)到服务器(j2ee后台服务器,ssh框架)
- Android之判断手机是否联网
- Android-BaseLine框架初识之MVP模式最佳方案(三)
- android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)
- android 一个页面内 多个listview的实现滑动显示
- Android下使用正则表达式
- Android之将对象转换json字符串
- Android消息推送1----原始的socket长链接
- Android之二维码的生成
- android中广播的使用(动态和静态注册)
- Android 颜色透明度
- 安卓TextView设置字体竖直排列
- Android自定义View流程
- android:name 的秘密
- 为了安全——应用锁屏开发实战
- 把Android源码中的密码对转换为keystore的方法
- android的Devices窗口中Online显示成Offline