2015-11-03 3 views
3

В моем приложении я показываю все ошибки, снимая снимок экрана, снимая его граффити и добавляя текст ошибки на нем. Вот как я делаю скриншот:Способ сделать снимок экрана быстрее

private Bitmap getBitmapFromView(View v) { 
    Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(bitmap); 
    v.draw(canvas); 
    return bitmap; 
} 

final ViewGroup root = (ViewGroup) getWindow().getDecorView(); 
Bitmap bitmap = getBitmapFromView(root); 

А затем преобразовать растровое изображение в оттенки серого, добавить текст и показать. Моя проблема в том, что getBitmapFromView на некоторых устройствах (Galaxy S5 неожиданных битвах) занимает 500-700 мс для завершения. Мой вопрос в том, есть ли какой-нибудь более быстрый способ сделать снимок экрана или весь экран? Я пробовал View.getDrawingCache(), и он такой же медленный. Если я прав, то он работает так же, как мой метод getBitmapFromView.

EDIT:

Хорошо, я понял, что послужило причиной столь низкой производительности с помощью Android Monitor и метод профилирования в моем случае. Это было GradientDrawable, набрав 80% времени, чтобы нарисовать. Я оптимизировал его, и теперь он занимает около 150 мс. сделать снимок экрана. Но вопрос остается прежним: есть ли более быстрый способ сделать это? Может быть, используя NDK?

+0

Вы пробовали использовать Bitmap.Config.RGB_565 вместо Bitmap.Con fig.ARGB_8888 или вам нужно использовать альфа-канал? – Neil

+0

@ Нет, я пробовал все: «RGB_565',' ARGB_8888', 'ARGB_4444'. Все работают так же медленно. Единственный, который работает быстрее, это «ALPHA_8», но для меня это не имеет смысла. –

ответ

0

Ваше мнение Custome здесь

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    this.buildDrawingCache(); 
} 

Чтобы получить CacheBitmap только

view.getDrawingCache(); 

Это работает для меня, я могу получить CacheBitmap сразу

Но это плохой идеал, который может привести к некоторые проблемы с производительностью

+0

спасибо, но проблема в том, что я не использую свой пользовательский вид. Как сказано, я использую 'getWindow(). GetDecorView();' –

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