정확히 내가해야 할 일을 설명하려고 노력할 것입니다.
A, B, C라는 세 개의 별도 화면이 있습니다. HomeScreen이라는 또 다른 화면이 있는데, 여기에는 3 개의 화면 비트 맵이 모두 갤러리보기에 표시되고 사용자가 원하는보기를 선택할 수 있습니다.
3 개의 모든 화면의 비트 맵을 가져 와서 모든 화면을 HomeScreen 활동에만 배치하여 갤러리보기에 표시 할 수있었습니다. 자, 이것은 코드를 복잡하게 만들었고 단순화하고 싶습니다.
따라서 HomeScreen에서 다른 활동을 호출하여 표시하지 않고 해당 화면의 비트 맵을 가져올 수 있습니까? 예를 들어 방금 HomeScreen을 호출하고 Activity A, B, C를 호출하고 A, B, C의 활동이 표시되지 않는다고 가정하십시오. getDrawingCache ()에 의해 해당 화면의 비트 맵을 제공합니다. 그런 다음 해당 비트 맵을 HomeScreen의 갤러리보기에 표시 할 수 있습니다.
문제를 매우 명확하게 설명했으면합니다.
이것이 실제로 가능한지 알려주십시오.
답변
이를 수행 할 수있는 방법이 있습니다. 비트 맵과 캔버스를 생성하고 view.draw (canvas);
코드는 다음과 같습니다.
public static Bitmap loadBitmapFromView(View v) {
Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
v.draw(c);
return b;
}
보기가 표시되지 않은 경우 크기가 0이됩니다. 다음과 같이 측정 할 수 있습니다.
if (v.getMeasuredHeight() <= 0) {
v.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
Bitmap b = Bitmap.createBitmap(v.getMeasuredWidth(), v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
v.draw(c);
return b;
}
편집 : 이 게시물 에 따르면 , 값으로 전달하면 아무 일도하지 않습니다WRAP_CONTENT
makeMeasureSpec()
(일부 뷰 클래스에서는 작동하지만) 권장되는 방법은 다음과 같습니다.
// Either this
int specWidth = MeasureSpec.makeMeasureSpec(parentWidth, MeasureSpec.AT_MOST);
// Or this
int specWidth = MeasureSpec.makeMeasureSpec(0 /* any */, MeasureSpec.UNSPECIFIED);
view.measure(specWidth, specWidth);
int questionWidth = view.getMeasuredWidth();
답변
여기 내 해결책이 있습니다.
public static Bitmap getBitmapFromView(View view) {
Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(returnedBitmap);
Drawable bgDrawable =view.getBackground();
if (bgDrawable!=null)
bgDrawable.draw(canvas);
else
canvas.drawColor(Color.WHITE);
view.draw(canvas);
return returnedBitmap;
}
즐겨 🙂
답변
이 시도,
/**
* Draw the view into a bitmap.
*/
public static Bitmap getViewBitmap(View v) {
v.clearFocus();
v.setPressed(false);
boolean willNotCache = v.willNotCacheDrawing();
v.setWillNotCacheDrawing(false);
// Reset the drawing cache background color to fully transparent
// for the duration of this operation
int color = v.getDrawingCacheBackgroundColor();
v.setDrawingCacheBackgroundColor(0);
if (color != 0) {
v.destroyDrawingCache();
}
v.buildDrawingCache();
Bitmap cacheBitmap = v.getDrawingCache();
if (cacheBitmap == null) {
Log.e(TAG, "failed getViewBitmap(" + v + ")", new RuntimeException());
return null;
}
Bitmap bitmap = Bitmap.createBitmap(cacheBitmap);
// Restore the view
v.destroyDrawingCache();
v.setWillNotCacheDrawing(willNotCache);
v.setDrawingCacheBackgroundColor(color);
return bitmap;
}
답변
나는 이것이 오래된 문제 일지 모른다는 것을 알고 있지만이 솔루션 중 어느 것이나 나를 위해 일하는 데 문제가있었습니다. 특히, 부풀린 후에 뷰를 변경하면 해당 변경 사항이 렌더링 된 비트 맵에 통합되지 않습니다.
다음은 내 경우에 효과가 있었던 방법입니다. 그러나 한 가지 경고가 있습니다. 전화하기 전에 getViewBitmap(View)
뷰를 부풀려서 알려진 치수의 레이아웃을 요청했습니다. 내보기 레이아웃은 내용이 내부에 놓일 때까지 높이 / 너비가 0이되기 때문에 필요했습니다.
View view = LayoutInflater.from(context).inflate(layoutID, null);
//Do some stuff to the view, like add an ImageView, etc.
view.layout(0, 0, width, height);
Bitmap getViewBitmap(View view)
{
//Get the dimensions of the view so we can re-layout the view at its current size
//and create a bitmap of the same size
int width = view.getWidth();
int height = view.getHeight();
int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
int measuredHeight = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY);
//Cause the view to re-layout
view.measure(measuredWidth, measuredHeight);
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
//Create a bitmap backed Canvas to draw the view into
Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
//Now that the view is laid out and we have a canvas, ask the view to draw itself into the canvas
view.draw(c);
return b;
}
나를위한 “매직 소스”는 여기에서 찾을 수 있습니다 :
https://groups.google.com/forum/#!topic/android-developers/BxIBAOeTA1Q
건배,
남자 이름
답변
Android KTX에는 훌륭한 Kotlin 확장 기능이 있습니다. View.drawToBitmap(Bitmap.Config)
답변
도움이 되었기를 바랍니다
View view="some view instance";
view.setDrawingCacheEnabled(true);
Bitmap bitmap=view.getDrawingCache();
view.setDrawingCacheEnabled(false);
getDrawingCache()
API 레벨 28에서는 업데이트 방법이 더 이상 사용되지 않습니다. 따라서 API 레벨> 28에 대한 다른 대안을 찾으십시오.
답변
비트 맵으로 레이아웃 또는보기 :
private Bitmap createBitmapFromLayout(View tv) {
int spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
tv.measure(spec, spec);
tv.layout(0, 0, tv.getMeasuredWidth(), tv.getMeasuredHeight());
Bitmap b = Bitmap.createBitmap(tv.getMeasuredWidth(), tv.getMeasuredWidth(),
Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
c.translate((-tv.getScrollX()), (-tv.getScrollY()));
tv.draw(c);
return b;
}
전화 방법 :
Bitmap src = createBitmapFromLayout(View.inflate(this, R.layout.sample, null)/* or pass your view object*/);