그래서 내 응용 프로그램의 기본 레이아웃에서 사용자에게 표시하는 다양한보기에 애니메이션을 적용하여 내 응용 프로그램 내에 동적으로 이미지를 만듭니다.둥근 모서리가있는 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 파일로 내보낼 수 있습니다?
도움을 주셔서 감사 드리며, 전체적으로 문제에 대한 다양한 접근 방법에 대한 제안을 남깁니다.
appWidget을 통해이 PNG 이미지를 표시하는 방법을 알아야 할 경우에도 여기에 대한 방법을 발견했습니다. http://stackoverflow.com/questions/25944639/appwidget-refresh-uri-for -remoteviews/25955078 # 25955078 –