您的位置:首页 > 移动开发 > Android开发

android开发步步为营之96:android两种常用截图技术

2016-03-16 16:09 330 查看
最近的一个需求是给系统换背景图后,能将换背景图的效果图展示给用户看,那么就需要用到截图技术,通过查阅相关资料,常用的截图技术主要有两种:一、通过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.

不能在子线程去操作主线程的视图。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: