2014-09-16 18 views
0

그래서 내 응용 프로그램의 기본 레이아웃에서 사용자에게 표시하는 다양한보기에 애니메이션을 적용하여 내 응용 프로그램 내에 동적으로 이미지를 만듭니다.둥근 모서리가있는 AppWidget 이미지

현재 레이아웃의 이미지를 비트 맵으로 저장 한 다음 비트 맵을 SD로 저장하여 uri를 통해 appwidget에 액세스 할 수 있도록 RelativeLayout 내에서 장면을 생성하고 있습니다.

모두가 appwidget 이미지를 모서리를 둥글게 만들려면 attmept에 ... 큰 노력하지만, 난 내가 찾은이 두 조각을 사용하여 시도했다 here.

내 문제 :

이 방법은 드로어 블을 생성합니다 (드로어 블로 표시되는 경우 둥근 모서리가 완벽하게 보입니다)하지만이 투명한 코너를 이미지 파일로 내 보내야합니다. 아래 CustomView의 drawToBitmap 메서드는 비트 맵 이미지를 생성하지만 모서리는 완전하고 정사각형입니다.

/** 
* 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는

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(); 

하지만 아무 소용에 RoundedCornersDrawable

이다. 이 모든 접근 방식은 복잡해 보일지 모르지만, 이것이 AppWidget의 RemoteView의 제약 사항을 해결하기 위해 내놓은 것입니다.

내 질문 :

가 어떻게이 RoundedCornersDrawable 가지고 가고, 제대로 아름다운 trasnparent 코너의 묘사 PNG 파일로 내보낼 수 있습니다?

도움을 주셔서 감사 드리며, 전체적으로 문제에 대한 다양한 접근 방법에 대한 제안을 남깁니다.

답변

0

:

'그것은 내 AppWidget의 크기가 이미지에게 전체 시간을 클리핑이라고 밝혀졌습니다.둥근 모서리를 제거하기에 충분할 정도로 클리핑하고, 분명히 클리핑되지 않았으므로 을 조금만 잘라냅니다. 따라서이 질문을 통해 나온 의 모든 사람들은이 목적을위한이 메소드의 모든 작업을 수행합니다. 단지 결과를 으로 볼 수있을 정도로 AppWidget을 크게 만드는 것을 잊지 마십시오. '

답변 :

나는 또한 PNG 파일로 내보내기 전에 CustomView.drawToBitMap() 메소드를 통해 RoundedCornersDrawable을 통과하는 것이 중요했다 발견합니다.

언젠가는 누군가가 길 아래에서 도움이되기를 바랍니다.

+0

appWidget을 통해이 PNG 이미지를 표시하는 방법을 알아야 할 경우에도 여기에 대한 방법을 발견했습니다. http://stackoverflow.com/questions/25944639/appwidget-refresh-uri-for -remoteviews/25955078 # 25955078 –

1

슬프게도, AppWidgets은보기 측면에서 상당히 제한적입니다. Android에서 지원하는보기 만 사용할 수 있습니다.

이유는보기의 코드가 AppWidget의 컨테이너에서 실행되어야하며 이는 보안상의 위험이 있기 때문에 표시하는 앱의 비공개 데이터를 볼 수 있기 때문입니다. 그래서 Google이 한 것은 무엇을 보여줄지를 준비해야하고, 끝나면 제한된 API에게 AppWidget 표시 방법을 알려주는 것입니다.

그래서 해결책은 이미지를 표시해야하는 것처럼 이미지 뷰 또는 이와 유사한 것으로 플러시하는 것입니다. 준비가 많이 필요한 경우 백그라운드에서 수행하도록 제안합니다.

모두 사용자의 필요에 따라 다릅니다. 이 문제 외에도

+0

제 편집에서 알 수 있듯이 문제를 정리했습니다. 시간을내어 주셔서 감사합니다. 이 질문에 대한 답이 저의 길이었습니다. 결과에 만족합니다. 고맙습니다! –

+0

문제를 어떻게 해결했는지 이해할 수 없습니다. 대답을 올리시겠습니까? –

+0

간단한 감시 만 가능합니다. 이 방법은 전체 시간 동안 작동 했었지만 위젯은 결과를 표시하기에는 너무 작았습니다. –