2016-08-29 5 views
0

Я использую эту часть кода, чтобы получить где-то около SO:Android - Пустое пространство под статусной на скриншоте

private static Bitmap getScreenshot(View v) { 
    Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888); 
    Canvas c = new Canvas(b); 
    v.draw(c); 
    /*v.setDrawingCacheEnabled(true); 
    Bitmap bitmap = Bitmap.createBitmap(v.getDrawingCache()); 
    v.setDrawingCacheEnabled(false);*/ 
    return b; 
} 

, чтобы получить скриншот зрения. Это, как я получаю вид своей деятельности в: getWindow().getDecorView().getRootView()

Everytime я сделать это, он получает весь экран, но с дополнительным белым пространством высоты StatusBar «s выше Toolbar. Я потерялся здесь, пожалуйста, спросите меня о какой-либо дополнительной информации, которую я должен был предоставить, но нет.

EDIT: Я забыл, я использую его в сочетании размытия:

public static Bitmap blur(Context ctx, Bitmap image) { 
    final float BITMAP_SCALE = 0.4f; 
    final float BLUR_RADIUS = 7.5f; 
    int width = Math.round(image.getWidth() * BITMAP_SCALE); 
    int height = Math.round(image.getHeight() * BITMAP_SCALE); 

    Bitmap inputBitmap = Bitmap.createScaledBitmap(image, width, height, false); 
    Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap); 

    RenderScript rs = RenderScript.create(ctx); 
    ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); 
    Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap); 
    Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap); 
    theIntrinsic.setRadius(BLUR_RADIUS); 
    theIntrinsic.setInput(tmpIn); 
    theIntrinsic.forEach(tmpOut); 
    tmpOut.copyTo(outputBitmap); 

    return outputBitmap; 
} 

И метод, называемый в Activity:

public static Bitmap blur(View v) { 
    return blur(v.getContext(), getScreenshot(v)); 
} 

Вот SS окна

Blank White Space on top

+0

Не могли бы вы показать мне снимок экрана? –

+0

Я опубликовал скриншот и ... У меня внезапная ясность, я скоро отправлю ответ –

ответ

1

Просто обновить java код согласно ниже

DisplayMetrics dm = new DisplayMetrics(); 
     ((Activity) this.getContext()).getWindowManager().getDefaultDisplay().getMetrics(dm); 

    android.view.ViewGroup.LayoutParams params = layout.getLayoutParams(); 
    int width = params.width; 
    int height = params.height; 

    Rect rectangle = new Rect(); 
    Window window = ((Activity) RatioImageAd.this.getContext()).getWindow(); 
    window.getDecorView().getWindowVisibleDisplayFrame(rectangle); 

    float imageProportion = (float) width/(float) height; 
    // Get the width of the screen 
    int screenWidth = dm.widthPixels; 
    int screenHeight = window.findViewById(Window.ID_ANDROID_CONTENT).getHeight() - window.findViewById(Window.ID_ANDROID_CONTENT).getPaddingTop(); 
    float screenProportion = (float) screenWidth/(float) screenHeight; 

    if (imageProportion > screenProportion) { 
     params.width = screenWidth; 
     params.height = (int) ((float) screenWidth/imageProportion); 
    } else { 
     params.width = (int) (imageProportion * (float) screenHeight); 
     params.height = screenHeight; 
    } 
    layout.setLayoutParams(params); 
} 

и передать layout как взгляд в функции

+0

Я сделал, и «Фрагмент» не получил скриншотов, я отправил ответ, но нуждаюсь в улучшении, см. ответ, который я написал .. –

+0

см. мой обновленный он будет работать 100% –

+0

Да, он должен быть в состоянии определить часть окна, которое должно быть принято, но теперь я использую свое собственное решение, которое я получил внезапно lol –

0

я получил ответ, когда перечитать мой вопрос лол, я сказал, что это та же высота, как StatusBar, да? И я вспомнил, где-то в моем Utilities классе у меня есть это:

public static int getStatusBarHeight(Context context){ 
    int result = 0; 
    int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen" , "android"); 
    if(resourceId > 0){ 
     result = context.getResources().getDimensionPixelSize(resourceId); 
    } 
    return result; 
} 

Так что я изменить мой размытость в:

private static Bitmap getScreenshot(View v) { 
    /*Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight() - getStatusBarHeight(v.getContext()), Bitmap.Config.ARGB_8888); 
    Canvas c = new Canvas(b); 
    v.draw(c);*/ 
    v.setDrawingCacheEnabled(true); 
    Bitmap b = Bitmap.createBitmap(v.getDrawingCache()); 
    Bitmap bb = Bitmap.createBitmap(b, 0, getStatusBarHeight(v.getContext()), b.getWidth(), b.getHeight() - getStatusBarHeight(v.getContext()), null, true); 
    v.setDrawingCacheEnabled(false); 
    return bb; 
} 

Любая идея по улучшению кода? Я создал два Bitmaps, которые касаются ..

Смежные вопросы