2014-09-16 2 views
0

Итак, я динамически создаю изображение в своем приложении, анимируя различные Представления, которые я показываю пользователю в основном макете моего приложения.Изображение AppWidget с закругленными углами

В настоящее время я создаю свою сцену в RelativeLayout, беря изображение макета как растровое изображение, а затем сохраняя растровое изображение на SD, доступ к которому будет осуществляться приложением через uri.

Это все работает прекрасно, но ... в attmept создать закругленные углы для appwidget изображения, я попытался с помощью этих двух фрагментов, которые я нашел here.

Моя проблема:

заключается в том, что этот метод генерирует выталкиваемый (чьи закругленные углы выглядят идеально, если отображаться как растяжимые), но мне нужно экспортировать эти прозрачные углы в виде файла изображения. Метод drawToBitmap в CustomView ниже генерирует растровое изображение, но углы полны и квадратны.

/** 
* shows a bitmap as if it had rounded corners. based on : 
* http://rahulswackyworld.blogspot.co.il/2013/04/android-drawables-with-rounded_7.html 
*/ 
public class RoundedCornersDrawable extends BitmapDrawable { 

    private final BitmapShader bitmapShader; 
    private final Paint p; 
    private final RectF rect; 
    private final float borderRadius; 

    public RoundedCornersDrawable(final Resources resources, final Bitmap bitmap, final float  borderRadius) { 
     super(resources, bitmap); 
     bitmapShader = new BitmapShader(getBitmap(), Shader.TileMode.CLAMP,  Shader.TileMode.CLAMP); 
     final Bitmap b = getBitmap(); 
     p = getPaint(); 
     p.setAntiAlias(true); 
     p.setShader(bitmapShader); 
     final int w = b.getWidth(), h = b.getHeight(); 
     rect = new RectF(0, 0, w, h); 
     this.borderRadius = borderRadius < 0 ? 0.15f * Math.min(w, h) : borderRadius; 
    } 

    @Override 
    public void draw(final Canvas canvas) { 
     canvas.drawRoundRect(rect, borderRadius, borderRadius, p); 
    } 
} 

и

public class CustomView extends ImageView { 
    private FrameLayout mMainContainer; 
    private boolean mIsDirty=false; 

    // TODO for each change of views/content, set mIsDirty to true and call invalidate 

    @Override 
    protected void onDraw(final Canvas canvas) { 
     if (mIsDirty) { 
      mIsDirty = false; 
      drawContent(); 
      return; 
     } 
     super.onDraw(canvas); 
    } 

    /** 
    * draws the view's content to a bitmap. code based on : 
    * http://nadavfima.com/android-snippet-inflate-a-layout-draw-to-a-bitmap/ 
    */ 
    public static Bitmap drawToBitmap(final View viewToDrawFrom, final int width, final int height) { 
     // Create a new bitmap and a new canvas using that bitmap 
     final Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
     final Canvas canvas = new Canvas(bmp); 
     viewToDrawFrom.setDrawingCacheEnabled(true); 
     // Supply measurements 
     viewToDrawFrom.measure(MeasureSpec.makeMeasureSpec(canvas.getWidth(),  MeasureSpec.EXACTLY), 
       MeasureSpec.makeMeasureSpec(canvas.getHeight(), MeasureSpec.EXACTLY)); 
     // Apply the measures so the layout would resize before drawing. 
     viewToDrawFrom.layout(0, 0, viewToDrawFrom.getMeasuredWidth(), viewToDrawFrom.getMeasuredHeight()); 
     // and now the bmp object will actually contain the requested layout 
     canvas.drawBitmap(viewToDrawFrom.getDrawingCache(), 0, 0, new Paint()); 
     return bmp; 
    } 

    private void drawContent() { 
     if (getMeasuredWidth() <= 0 || getMeasuredHeight() <= 0) 
      return; 
     final Bitmap bitmap = drawToBitmap(mMainContainer, getMeasuredWidth(), getMeasuredHeight()); 
     final RoundedCornersDrawable drawable = new RoundedCornersDrawable(getResources(),  bitmap, 15); 
     setImageDrawable(drawable); 
    } 
} 

Я понимаю, что битовая карта не переносит информацию альфа, которая необходима, чтобы иметь прозрачные закругленные углы в изображении, Так что я попытался сохранить файл как PNG, как так ;

RCD_test является RoundedCornersDrawable

Bitmap bitmap = RCD_test.getBitmap(); 
bitmap.setHasAlpha(true); 
OutputStream stream = new   
FileOutputStream(Environment.getExternalStorageDirectory().getPath()+"/test/screenshottest.png"); 
bitmap.compress(CompressFormat.PNG, 100, stream); 
stream.close(); 

, но безрезультатно. Весь этот подход может показаться непрозрачным, но это то, что я придумал для устранения ограничений RemoteViews от AppWidget.

Мой вопрос:

Как я могу принять это RoundedCornersDrawable, и экспортировать его в виде PNG-файла, который правильно изображающая это красивые trasnparent углы?

Заранее благодарим за помощь, и я открыт для любых предложений по различным подходам к проблеме в целом!

ответ

0

В дополнение к этому вопросу:

«Оказывается, что размер моего AppWidget был обрезая изображение в все время.Обрезать его достаточно, чтобы удалить закругленные углы, и просто так мало, что не были явно обрезаны. Итак, для кого-то , который сталкивается с этим вопросом ... все эти методы работы для этой цели (просто не забудьте сделать свой AppWidget достаточно большим, чтобы увидеть результаты ). '

Ответ:

Я нашел, что это было важно также передать RoundedCornersDrawable по методу CustomView.drawToBitMap() перед экспортом в файл PNG.

Я надеюсь, что это все поможет кому-нибудь по дороге когда-нибудь!

+0

Если вам также нужно выяснить, как отобразить это изображение PNG через приложение appWidget, я также нашел способ для этого: http://stackoverflow.com/questions/25944639/appwidget-refresh-uri-for -remoteviews/25955078 # 25955078 –

1

К сожалению, AppWidgets довольно ограничены с точки зрения просмотров. вы можете использовать только те представления, которые поддерживает Android.

Причина в том, что код представления должен запускаться в контейнере AppWidget, и это угроза безопасности, поскольку вы можете получить представление о частных данных приложения, которое показывает его. Так что Google сделал то, что вам нужно подготовить, что показывать, и когда вы закончите, сообщите ограниченному API, как показать AppWidget.

Таким образом, решение заключается в том, чтобы очистить изображение, как оно должно быть показано, до изображения или чего-то подобного. Я предлагаю сделать это в фоновом режиме, если у него есть много, чтобы подготовиться.

Все зависит от ваших потребностей.

+0

Как вы можете видеть из моего редактирования, я разобрался в своей проблеме. Спасибо, что нашли время, чтобы посмотреть на это. Это был ваш ответ на другой вопрос, который заставил меня начать этот путь, и я доволен результатами. Спасибо! –

+0

Я не понимаю, как вы решили проблему. можете ли вы отправить ответ? –

+0

просто простой недосмотр. эти методы работали все время, мой виджет был слишком мал, чтобы отображать результаты. –

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