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