2010-02-02 1 views
13

내 첫 번째로 가장 멋진 Android 프로젝트의 경우, 요즘 아이들이 열광하고있는 Arc Clocks 중 하나를 표시하는 홈 화면 위젯을 만들고 싶습니다. RemoteViews의 한계를 바탕으로동적으로 그려진 콘텐츠로 Android 위젯을 구현하는 적절한 방법은 무엇입니까?

, 그것은 적절한 방법이 실제로 화면이 실제 레이아웃에 ImageView을 사용하는 것입니다 그려 질 것을 나에게 보인다는 업데이트하고 다음 경우, ShapeDrawable 또는 두 가지를 만들고 그릴 새로 생성 된 에 추가합니다. 그런 다음 해당 비트 맵 ImageView 원본으로 설정하십시오.

나는 그저 grokking하지 않는 그 과정에 대해 뭔가가있다. 다음은 위젯을 업데이트하는 데 사용하려고 시도한 코드입니다. 나는 아무것도 화면에 그려지지 않습니다. ImageView의 자리 표시 자 이미지는 src 속성으로 설정됩니다. 코드를 실행하여 도면에 업데이트하지 않으면 자리 표시 자 이미지가 그대로 유지됩니다. 그래서,이 코드는 무언가가 일 뿐이며, 분명히 이 아니고 일이라고 생각합니다.

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget); 
Bitmap bitmap = Bitmap.createBitmap(100, 100, Config.ARGB_8888); 
Canvas canvas = new Canvas(bitmap); 

ShapeDrawable drawable = new ShapeDrawable(new ArcShape(0, 360)); 
drawable.getPaint().setColor(0xffff0000); 
drawable.getPaint().setStrokeWidth(5.0f); 
drawable.setIntrinsicWidth(100); 
drawable.setIntrinsicHeight(100); 
drawable.draw(canvas); 

views.setImageViewBitmap(R.id.ImageView01, bitmap);  
appWidgetManager.updateAppWidget(appWidgetId, views); 

나는 그렇게 쉽게 알 수 없다. 그래서 나는 올바른 방향으로 향하고 있습니까?


업데이트

좋아, 어쩌면 너무 많은 정보이었다. 내가 실제로 묻고 자하는 질문은 다음과 같습니다.

위젯에 도형을 그려야 할 경우 ImageView를 사용하여 ShapeDrawable에서 비트 맵을 만들거나 더 적절한 방법으로 위젯을 그려야합니다. 그것은 RemoteViews에 의해 제약이 있습니까?

+0

그 위에 무언가를 그리려고 할 때 자리 표시자가 여전히 있다고 말하는 것입니까? – sandos

+0

아니요, 자리 표시 자 이미지가 사라집니다. 화면에 아무것도 보이지 않게됩니다. 그러나 위젯을 누른 채로 여전히 제거 할 수 있습니다. – MojoFilter

답변

8

SDK에 실제로 수행하려는 것과 유사한 AnalogClock이라는 위젯이 있습니다.

View을 확장하고 @RemoteView으로 주석 된 클래스로 구현됩니다. 수신기를 Intent.ACTION_TIME_TICKIntent.ACTION_TIME_CHANGED에 등록하고 onDraw 메서드를 재정 의하여 자체를 그립니다. source을 확인하십시오. 표준 AlarmClock 응용 프로그램 exposesthisview은 홈 화면에 추가 할 수있는 위젯입니다.

나는 당신이 묘사 한 것을 구현하고 분명하게 잘 작동하는 좋은 방법이라고 생각합니다.

+0

오, 멋지다. 나는 당신이보기를 확장하여 RemoteView에 추가 할 수 없다는 인상 아래에서, 매우 특정한 유형 만이 RemoteView에서 허용 되었기 때문에 심지어 서브 클래스도 허용했기 때문에. 그게 전부라면, 나는 로큰롤 할 수 있어야한다고 생각합니다. 나는 그것을 줄 것이다. – MojoFilter

+0

이것은 저에게 깊은 인상을 주었던 문서입니다 : http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout – MojoFilter

+0

나는 이것을 시도해 보았습니다. 불행히도보기를 서브 클래 싱하여 추가 할 수 없습니다. 내가 말할 수있는 한 RemoteView에서 사용되는 레이아웃. AnalogClock보기에서 작동하는 유일한 이유는 AnalogClock이 명시 적으로 허용되는 구성 요소 중 하나라는 것입니다. – MojoFilter

0

사용자 지정 구성 요소를 만들려면 View 또는 View의 하위 클래스를 확장하고 드로잉을 수행 할 onDraw (Canvas canvas) 메서드를 재정의합니다. 하여 캔버스 객체에서 당신은 ..... 등등 drawLine(), drawArc(), drawPicture(), drawPoints(), DrawText(), 기타의 drawRect() 등의 메소드를 호출 할 수

Here's more details.

Here's the api for canvas.

다음 위젯을 만들기 위해 원격보기에 사용자 지정보기를 추가 할 수 있다고 생각합니다.

+0

그게 전부 문제라고 확신합니다. 뷰를 서브 클래스화할 수 있다면 정말 간단 할 것입니다. 그러나 위젯과 대화하는 데 사용되는 RemoteView는 매우 특정한 요소 집합만을 포함 할 수 있습니다. – MojoFilter

5

이 잘 작동 :

Paint p = new Paint(); 
p.setAntiAlias(true); 
p.setStyle(Style.STROKE); 
p.setStrokeWidth(8); 
p.setColor(0xFFFF0000); 

Bitmap bitmap = Bitmap.createBitmap(100, 100, Config.ARGB_8888); 
Canvas canvas = new Canvas(bitmap); 
canvas.drawArc(new RectF(10, 10, 90, 90), 0, 270, false, p); 

RemoteViews views = new RemoteViews(updateService.getPackageName(), R.layout.main); 
views.setImageViewBitmap(R.id.canvas, bitmap); 

ComponentName componentName = new ComponentName(updateService, DashboardAppWidgetProvider.class); 
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(updateService); 
appWidgetManager.updateAppWidget(componentName, views); 

나는 원래 코드로 아크를 그리는 다만 방법이 문제를 한 것 같아요 - 아무것도가 없었다 이유입니다.

BTW : "아크 클럭"을 검색하여 시장에서 매우 작은 메모리 사용량을 가진 맞춤 설정할 수있는 "아크 클록"을 찾을 수 있습니다!