Android에서 뷰를 표시하지 않고 비트 맵으로 변환 하시겠습니까? 개의 모든

정확히 내가해야 할 일을 설명하려고 노력할 것입니다.

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_CONTENTmakeMeasureSpec() (일부 뷰 클래스에서는 작동하지만) 권장되는 방법은 다음과 같습니다.

// 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*/);