在Android的我怎样才能从定制表面查看截图或位图 [英] in android how can i get screenshot or bitmap from custom surface view
问题描述
我创建的Android应用程序,我需要把位图从包含的ImageView和第二我的框架布局是定制的面查看XML文件如下,但是当我试图从框架布局我得到唯一的位图使屏幕短下面的图片不是上面的影像可以在任何一人多高我怎么能得到所有FRAM布局的位图
<的LinearLayout
机器人:ID =@ + ID /线性
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT
机器人:layout_gravity =中心| CENTER_HORIZONTAL
机器人:layout_marginLeft =20dp
机器人:layout_marginRight =20dp
机器人:layout_marginTop =10dp
机器人:方向=横向> <的FrameLayout
机器人:ID =@ + ID /帧
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT> <的FrameLayout
机器人:ID =@ + ID / frmQueue
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT> < ImageView的
机器人:ID =@ + ID / imglow
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT
机器人:contentDescription =@字符串/ APP_NAME
机器人:scaleType =centerCrop/> < com.winsontan520.WScratchView
机器人:ID =@ + ID / scratch_view
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT
机器人:layout_gravity =中心/> < /&的FrameLayout GT;
< /&的FrameLayout GT;
< / LinearLayout中>
WScratchView.java
公共类WScratchView扩展SurfaceView实现IWScratchView,SurfaceHolder.Callback {
私有静态最后弦乐TAG =WScratchView;//默认值常量
私人最终诠释DEFAULT_COLOR = 0xff444444; //默认颜色为深灰色
公共静态INT DEFAULT_REVEAL_SIZE = 30;公共静态最终诠释DEFAULT_SCRATCH_TEST_SPEED = 4;
私人语境mContext;
公共位图兆位;
私人WScratchViewThread mThread;
清单<路径和GT; mPathList =新的ArrayList<路径>();
公众诠释mOverlayColor;
市民漆mOverlayPaint;
公众诠释mRevealSize;
私人布尔mIsScratchable = TRUE;
私人布尔mIsAntiAlias = FALSE;
私人路径路径;
私人浮动运行startx = 0;
私人浮动startY = 0;
私人布尔mScratchStart = FALSE;
公共位图mScratchBitmap;
公众可绘制mScratchDrawable = NULL;
私人涂料mBitmapPaint;
私人矩阵mMatrix;
私人位图mScratchedTestBitmap;
公共帆布mScratchedTestCanvas;
私人OnScratchCallback mOnScratchCallback;//启用划痕所有地区,如果mClearCanvas是真的
私人布尔mClearCanvas = FALSE;
//启用WScratchView点击,如果mIsClickable是真的
私人布尔mIsClickable = FALSE;公共WScratchView(上下文CTX,ATTRS的AttributeSet){
超(CTX,ATTRS);
的init(CTX,ATTRS);
}公共WScratchView(上下文的背景下){
超级(上下文);
的init(背景下,NULL);
}私人无效的init(上下文的背景下,ATTRS的AttributeSet){
mContext =背景; // 默认值
mOverlayColor = DEFAULT_COLOR;
mRevealSize = DEFAULT_REVEAL_SIZE; TypedArray TA = context.obtainStyledAttributes(ATTRS,R.styleable.WScratchView,0,0); 最终诠释indexCount = ta.getIndexCount();
的for(int i = 0; I< indexCount;我++){
INT ATTR = ta.getIndex(ⅰ);
如果(ATTR == R.styleable.WScratchView_overlayColor){
mOverlayColor = ta.getColor(ATTR,DEFAULT_COLOR);
}否则如果(ATTR == R.styleable.WScratchView_revealSize){
mRevealSize = ta.getDimensionPixelSize(ATTR,DEFAULT_REVEAL_SIZE);
}否则如果(ATTR == R.styleable.WScratchView_antiAlias){
mIsAntiAlias = ta.getBoolean(ATTR,FALSE);
}否则如果(ATTR == R.styleable.WScratchView_scratchable){
mIsScratchable = ta.getBoolean(ATTR,真);
}否则如果(ATTR == R.styleable.WScratchView_scratchDrawable){
mScratchDrawable = ta.getDrawable(R.styleable.WScratchView_scratchDrawable);
}
} setZOrderOnTop(真);
SurfaceHolder支架= getHolder();
holder.addCallback(本);
holder.setFormat(PixelFormat.TRANSPARENT); mOverlayPaint =新的油漆();
mOverlayPaint.setXfermode(新PorterDuffXfermode(Mode.CLEAR));
mOverlayPaint.setStyle(Paint.Style.STROKE);
mOverlayPaint.setStrokeCap(Paint.Cap.ROUND);
mOverlayPaint.setStrokeJoin(Paint.Join.ROUND); //转换绘制如果绘制在XML已经被设置为位图
如果(mScratchDrawable!= NULL){
mScratchBitmap =((BitmapDrawable)mScratchDrawable).getBitmap();
} mBitmapPaint =新的油漆();
mBitmapPaint.setAntiAlias(真);
mBitmapPaint.setFilterBitmap(真);
mBitmapPaint.setDither(真);
}@覆盖
公共无效的onDraw(帆布油画){
super.onDraw(画布); //清除所有的区域,如果mClearCanvas是真的
如果(mClearCanvas){
canvas.drawColor(Color.TRANSPARENT,Mode.CLEAR);
返回;
} 如果(mScratchBitmap!= NULL){
如果(mMatrix == NULL){
浮动scaleWidth =(浮点)canvas.getWidth()/ mScratchBitmap.getWidth();
浮动scaleHeight =(浮点)canvas.getHeight()/ mScratchBitmap.getHeight();
mMatrix =新的Matrix();
mMatrix.postScale(scaleWidth,scaleHeight);
}
canvas.drawBitmap(mScratchBitmap,mMatrix,mBitmapPaint);
}其他{
canvas.drawColor(mOverlayColor);
} 对于(路径路径:mPathList){
mOverlayPaint.setAntiAlias(mIsAntiAlias);
mOverlayPaint.setStrokeWidth(mRevealSize); canvas.drawPath(路径,mOverlayPaint);
}
}私人无效updateScratchedPercentage(){
如果(mOnScratchCallback == NULL)回报;
mOnScratchCallback.onScratch(getScratchedRatio());
}@覆盖
公共布尔onTouchEvent(MotionEvent我){
同步(mThread.getSurfaceHolder()){
如果(!mIsScratchable){
返回true;
} 开关(me.getAction()){
案例MotionEvent.ACTION_DOWN:
路径=新路径();
path.moveTo(me.getX(),me.getY());
运行startx = me.getX();
startY = me.getY();
mPathList.add(路径);
打破;
案例MotionEvent.ACTION_MOVE:
如果(mScratchStart){
path.lineTo(me.getX(),me.getY());
}其他{
如果(isScratch(startx的,me.getX(),startY,me.getY())){
mScratchStart =真;
path.lineTo(me.getX(),me.getY());
}
}
updateScratchedPercentage();
打破;
案例MotionEvent.ACTION_UP:
//设置回调,如果用户的手指分离
如果(mOnScratchCallback!= NULL){
mOnScratchCallback.onDetach(真);
}
//执行单击操作,如果运动不动
//和WScratchView是点击
如果(mScratchStart&安培;!&安培; mIsClickable){
后(新的Runnable(){
@覆盖
公共无效的run(){
performClick();
}
});
}
mScratchStart = FALSE;
打破;
}
返回true;
}
}私人布尔isScratch(浮动oldX,浮法X,浮法oldY,浮动Y){
浮动距离=(浮点)的Math.sqrt(Math.pow(oldX - X,2)+ Math.pow(oldY - Y,2));
如果(距离> mRevealSize * 2){
返回true;
}其他{
返回false;
}
}@覆盖
公共无效surfaceChanged(SurfaceHolder为arg0,ARG1 INT,INT ARG2,诠释ARG3){
// 没做什么
}@覆盖
公共无效surfaceCreated(SurfaceHolder为arg0){
mThread =新WScratchViewThread(getHolder(),这一点);
mThread.setRunning(真);
mThread.start(); mScratchedTestBitmap = Bitmap.createBitmap(arg0.getSurfaceFrame()宽度(),arg0.getSurfaceFrame()高度(),Bitmap.Config.ARGB_8888);
mScratchedTestCanvas =新的Canvas(mScratchedTestBitmap);
}@覆盖
公共无效surfaceDestroyed(SurfaceHolder为arg0){
布尔重试= TRUE;
mThread.setRunning(假);
而(重试){
尝试{
mThread.join();
重试= FALSE;
}赶上(InterruptedException的E){
//什么也不做,但保持重试
}
}}类WScratchViewThread继承Thread {
私人SurfaceHolder mSurfaceHolder;
私人WScratchView MView的;
私人布尔mRun = FALSE; 公共WScratchViewThread(SurfaceHolder surfaceHolder,WScratchView视图){
mSurfaceHolder = surfaceHolder;
MVIEW =视图。
} 公共无效setRunning(布尔运行){
mRun =运行;
} 公共SurfaceHolder getSurfaceHolder(){
返回mSurfaceHolder;
} @覆盖
公共无效的run(){
帆布℃;
而(mRun){
C = NULL;
尝试{
C = mSurfaceHolder.lockCanvas(NULL);
同步(mSurfaceHolder){
如果(C!= NULL){
mView.draw(C);
}
}
} {最后
如果(C!= NULL){
mSurfaceHolder.unlockCanvasAndPost(C);
}
}
}
}
}@覆盖
公共无效resetView(){
同步(mThread.getSurfaceHolder()){
mPathList.clear();
}
}@覆盖
公共布尔isScratchable()
{
返回mIsScratchable;
}@覆盖
公共无效setScratchable(布尔标志){
mIsScratchable =标志;
}@覆盖
公共无效setOverlayColor(INT渣油){
mOverlayColor =渣油;
}@覆盖
公共无效setRevealSize(INT大小){
mRevealSize =大小;
}@覆盖
公共无效setAntiAlias(布尔标志){
mIsAntiAlias =标志;
}
@覆盖
公共无效setScratchDrawable(可绘制D){
mScratchDrawable = D;
如果(mScratchDrawable!= NULL){
mScratchBitmap =((BitmapDrawable)mScratchDrawable).getBitmap();
}
}@覆盖
公共无效setScratchBitmap(位图B){
mScratchBitmap = B;
}
@覆盖
公众持股量getScratchedRatio(){
返回getScratchedRatio(DEFAULT_SCRATCH_TEST_SPEED);
}/ **
*感谢https://github.com/daveyfong提供这个方法
* /
@覆盖
公众持股量getScratchedRatio(INT速度){
如果(空== mScratchedTestBitmap){
返回0;
}
画(mScratchedTestCanvas); 最终诠释宽度= mScratchedTestBitmap.getWidth();
最终诠释身高= mScratchedTestBitmap.getHeight(); 诠释计数= 0;
的for(int i = 0; I<宽度; I + =速度){
对于(INT J = 0; J<高度; J + =速度){
如果(0 == Color.alpha(mScratchedTestBitmap.getPixel(I,J))){
算上++;
}
}
}
浮完成=(浮点)数/((宽/速度)*(高度/速度))* 100; 返回完成;
}@覆盖
公共无效setOnScratchCallback(OnScratchCallback回调){
mOnScratchCallback =回调;
}公共静态抽象类OnScratchCallback {
公共抽象无效onScratch(浮动百分比);
//调用回funtion监视手指的状态
公共抽象无效onDetach(布尔fingerDetach);
}//设置mClearCanvas
@覆盖
公共无效setScratchAll(布尔scratchAll){
mClearCanvas = scratchAll;
}//设置WScartchView点击
@覆盖
公共无效setBackgroundClickable(布尔点击){
mIsClickable =点击;
}
}
和code为位图如下
gray.setOnClickListener(新OnClickListener(){ @覆盖
公共无效的onClick(查看为arg0){
// TODO自动生成方法存根
的FrameLayout FM =(的FrameLayout)findViewById(R.id.frmQueue);
fm.setDrawingCacheEnabled(真);
fm.buildDrawingCache();
位图BM = fm.getDrawingCache(); scratchView.setScratchBitmap(BM);
你能试试这件作品code的
公共位图loadBitmapFromView(视图V,诠释的宽度,高度INT){
位图B = Bitmap.createBitmap(宽度,高度,Bitmap.Config.ARGB_8888);
帆布C =新的Canvas(B);
v.layout(0,0,v.getLayoutParams()宽度,v.getLayoutParams()高度。);
v.draw(C);
返回b;
}
调用会是这样的。
(的FrameLayout,frameLayout.getLayoutParams()宽,frameLayout.getLayoutParams()的高度。) 位图imageBitmap = loadBitmapFromView);
您可以使用此code代表的FrameLayout?
的FrameLayout视图=(的FrameLayout)findViewById(R.id.framelayout);
view.setDrawingCacheEnabled(真);
view.buildDrawingCache();
位图BM = view.getDrawingCache();
i am creating android application and i need to take bitmap from my frame layout which contains imageview and second is custom surface view the xml file is as below but when i try to make screen short from frame layout i am getting only bitmap of below image not of above image can any one tall me how can i get the bitmap of all fram layout
<LinearLayout
android:id="@+id/linear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center|center_horizontal"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="10dp"
android:orientation="horizontal" >
<FrameLayout
android:id="@+id/frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<FrameLayout
android:id="@+id/frmQueue"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/imglow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/app_name"
android:scaleType="centerCrop" />
<com.winsontan520.WScratchView
android:id="@+id/scratch_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
</FrameLayout>
</FrameLayout>
</LinearLayout>
WScratchView.java
public class WScratchView extends SurfaceView implements IWScratchView, SurfaceHolder.Callback {
private static final String TAG = "WScratchView";
// default value constants
private final int DEFAULT_COLOR = 0xff444444; // default color is dark gray
public static int DEFAULT_REVEAL_SIZE = 30;
public static final int DEFAULT_SCRATCH_TEST_SPEED = 4;
private Context mContext;
public Bitmap mbits;
private WScratchViewThread mThread;
List<Path> mPathList = new ArrayList<Path>();
public int mOverlayColor;
public Paint mOverlayPaint;
public int mRevealSize;
private boolean mIsScratchable = true;
private boolean mIsAntiAlias = false;
private Path path;
private float startX = 0;
private float startY = 0;
private boolean mScratchStart = false;
public Bitmap mScratchBitmap;
public Drawable mScratchDrawable = null;
private Paint mBitmapPaint;
private Matrix mMatrix;
private Bitmap mScratchedTestBitmap;
public Canvas mScratchedTestCanvas;
private OnScratchCallback mOnScratchCallback;
//Enable scratch all area if mClearCanvas is true
private boolean mClearCanvas = false;
//Enable click on WScratchView if mIsClickable is true
private boolean mIsClickable = false;
public WScratchView(Context ctx, AttributeSet attrs) {
super(ctx, attrs);
init(ctx, attrs);
}
public WScratchView(Context context) {
super(context);
init(context, null);
}
private void init(Context context, AttributeSet attrs) {
mContext = context;
// default value
mOverlayColor = DEFAULT_COLOR;
mRevealSize = DEFAULT_REVEAL_SIZE;
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.WScratchView, 0, 0);
final int indexCount = ta.getIndexCount();
for (int i = 0; i < indexCount; i++) {
int attr = ta.getIndex(i);
if (attr == R.styleable.WScratchView_overlayColor) {
mOverlayColor = ta.getColor(attr, DEFAULT_COLOR);
} else if (attr == R.styleable.WScratchView_revealSize) {
mRevealSize = ta.getDimensionPixelSize(attr, DEFAULT_REVEAL_SIZE);
} else if (attr == R.styleable.WScratchView_antiAlias) {
mIsAntiAlias = ta.getBoolean(attr, false);
} else if (attr == R.styleable.WScratchView_scratchable) {
mIsScratchable = ta.getBoolean(attr, true);
} else if (attr == R.styleable.WScratchView_scratchDrawable) {
mScratchDrawable = ta.getDrawable(R.styleable.WScratchView_scratchDrawable);
}
}
setZOrderOnTop(true);
SurfaceHolder holder = getHolder();
holder.addCallback(this);
holder.setFormat(PixelFormat.TRANSPARENT);
mOverlayPaint = new Paint();
mOverlayPaint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));
mOverlayPaint.setStyle(Paint.Style.STROKE);
mOverlayPaint.setStrokeCap(Paint.Cap.ROUND);
mOverlayPaint.setStrokeJoin(Paint.Join.ROUND);
// convert drawable to bitmap if drawable already set in xml
if (mScratchDrawable != null) {
mScratchBitmap = ((BitmapDrawable) mScratchDrawable).getBitmap();
}
mBitmapPaint = new Paint();
mBitmapPaint.setAntiAlias(true);
mBitmapPaint.setFilterBitmap(true);
mBitmapPaint.setDither(true);
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
//Clear all area if mClearCanvas is true
if(mClearCanvas){
canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
return;
}
if (mScratchBitmap != null) {
if (mMatrix == null) {
float scaleWidth = (float) canvas.getWidth() / mScratchBitmap.getWidth();
float scaleHeight = (float) canvas.getHeight() / mScratchBitmap.getHeight();
mMatrix = new Matrix();
mMatrix.postScale(scaleWidth, scaleHeight);
}
canvas.drawBitmap(mScratchBitmap, mMatrix, mBitmapPaint);
} else {
canvas.drawColor(mOverlayColor);
}
for (Path path : mPathList) {
mOverlayPaint.setAntiAlias(mIsAntiAlias);
mOverlayPaint.setStrokeWidth(mRevealSize);
canvas.drawPath(path, mOverlayPaint);
}
}
private void updateScratchedPercentage() {
if(mOnScratchCallback == null) return;
mOnScratchCallback.onScratch(getScratchedRatio());
}
@Override
public boolean onTouchEvent(MotionEvent me) {
synchronized (mThread.getSurfaceHolder()) {
if (!mIsScratchable) {
return true;
}
switch (me.getAction()) {
case MotionEvent.ACTION_DOWN:
path = new Path();
path.moveTo(me.getX(), me.getY());
startX = me.getX();
startY = me.getY();
mPathList.add(path);
break;
case MotionEvent.ACTION_MOVE:
if (mScratchStart) {
path.lineTo(me.getX(), me.getY());
} else {
if (isScratch(startX, me.getX(), startY, me.getY())) {
mScratchStart = true;
path.lineTo(me.getX(), me.getY());
}
}
updateScratchedPercentage();
break;
case MotionEvent.ACTION_UP:
//Set call back if user's finger detach
if(mOnScratchCallback != null){
mOnScratchCallback.onDetach(true);
}
//perform Click action if the motion is not move
//and the WScratchView is clickable
if(!mScratchStart && mIsClickable){
post(new Runnable() {
@Override
public void run() {
performClick();
}
});
}
mScratchStart = false;
break;
}
return true;
}
}
private boolean isScratch(float oldX, float x, float oldY, float y) {
float distance = (float) Math.sqrt(Math.pow(oldX - x, 2) + Math.pow(oldY - y, 2));
if (distance > mRevealSize * 2) {
return true;
} else {
return false;
}
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// do nothing
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
mThread = new WScratchViewThread(getHolder(), this);
mThread.setRunning(true);
mThread.start();
mScratchedTestBitmap = Bitmap.createBitmap(arg0.getSurfaceFrame().width(), arg0.getSurfaceFrame().height(), Bitmap.Config.ARGB_8888);
mScratchedTestCanvas = new Canvas(mScratchedTestBitmap);
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
boolean retry = true;
mThread.setRunning(false);
while (retry) {
try {
mThread.join();
retry = false;
} catch (InterruptedException e) {
// do nothing but keep retry
}
}
}
class WScratchViewThread extends Thread {
private SurfaceHolder mSurfaceHolder;
private WScratchView mView;
private boolean mRun = false;
public WScratchViewThread(SurfaceHolder surfaceHolder, WScratchView view) {
mSurfaceHolder = surfaceHolder;
mView = view;
}
public void setRunning(boolean run) {
mRun = run;
}
public SurfaceHolder getSurfaceHolder() {
return mSurfaceHolder;
}
@Override
public void run() {
Canvas c;
while (mRun) {
c = null;
try {
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder) {
if (c != null) {
mView.draw(c);
}
}
} finally {
if (c != null) {
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
}
@Override
public void resetView() {
synchronized (mThread.getSurfaceHolder()) {
mPathList.clear();
}
}
@Override
public boolean isScratchable()
{
return mIsScratchable;
}
@Override
public void setScratchable(boolean flag) {
mIsScratchable = flag;
}
@Override
public void setOverlayColor(int ResId) {
mOverlayColor = ResId;
}
@Override
public void setRevealSize(int size) {
mRevealSize = size;
}
@Override
public void setAntiAlias(boolean flag) {
mIsAntiAlias = flag;
}
@Override
public void setScratchDrawable(Drawable d) {
mScratchDrawable = d;
if (mScratchDrawable != null) {
mScratchBitmap = ((BitmapDrawable) mScratchDrawable).getBitmap();
}
}
@Override
public void setScratchBitmap(Bitmap b) {
mScratchBitmap = b;
}
@Override
public float getScratchedRatio() {
return getScratchedRatio(DEFAULT_SCRATCH_TEST_SPEED);
}
/**
* thanks to https://github.com/daveyfong for providing this method
*/
@Override
public float getScratchedRatio(int speed) {
if (null == mScratchedTestBitmap) {
return 0;
}
draw(mScratchedTestCanvas);
final int width = mScratchedTestBitmap.getWidth();
final int height = mScratchedTestBitmap.getHeight();
int count = 0;
for (int i = 0; i < width; i += speed) {
for (int j = 0; j < height; j += speed) {
if (0 == Color.alpha(mScratchedTestBitmap.getPixel(i, j))) {
count++;
}
}
}
float completed = (float) count / ((width / speed) * (height / speed)) * 100;
return completed;
}
@Override
public void setOnScratchCallback(OnScratchCallback callback) {
mOnScratchCallback = callback;
}
public static abstract class OnScratchCallback{
public abstract void onScratch(float percentage);
//Call back funtion to monitor the status of finger
public abstract void onDetach(boolean fingerDetach);
}
//Set the mClearCanvas
@Override
public void setScratchAll(boolean scratchAll){
mClearCanvas = scratchAll;
}
//Set the WScartchView clickable
@Override
public void setBackgroundClickable(boolean clickable){
mIsClickable = clickable;
}
}
and the code for bitmap is as below
gray.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
FrameLayout fm = (FrameLayout)findViewById(R.id.frmQueue);
fm.setDrawingCacheEnabled(true);
fm.buildDrawingCache();
Bitmap bm =fm.getDrawingCache();
scratchView.setScratchBitmap(bm);
Can you try this piece of code
public Bitmap loadBitmapFromView(View v, int width, int height) {
Bitmap b = Bitmap.createBitmap(width , height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
v.draw(c);
return b;
}
The calling would be something like
Bitmap imageBitmap = loadBitmapFromView(frameLayout, frameLayout.getLayoutParams().width,frameLayout.getLayoutParams().height));
Can you use this code for FrameLayout?
FrameLayout view = (FrameLayout)findViewById(R.id.framelayout);
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bm = view.getDrawingCache();
这篇关于在Android的我怎样才能从定制表面查看截图或位图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!