티스토리 뷰
[android/widget] 안드로이드 이미지 루핑 위젯 구현하기(1x1,3x1)
#주의사항
-앱이 존재한 상태로 위젯이 추가된다.(helloworld 샘플로 찍힌 메인액티비티가 나왔어도 위젯 페이지 추가로 가면 위젯은 추가되어있다)
-이미지 루핑은 1x1에서만 구현되어있고, 3x1은 단순 이미지 노출이다.
-1x1 중심으로 코드를 기술하고, 풀소스를 하단에서 제공한다.
-바로 사용할 수 있게 풀 소스로 제공한다
#AndroidManifest.xml
-<receiver>2가지가 추가 되어있다. 각각 3x1 1x1 위젯이다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.imagewidget">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ImageWidget"
tools:targetApi="31">
<receiver
android:name=".Widget3x1_Provider"
android:exported="false">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget3x1__provider_info" />
</receiver>
<receiver
android:name=".Widget1x1_Provider"
android:exported="false">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget1x1__provider_info" />
</receiver>
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
#Widget1x1__provider_info.xml
-위젯프로바이더의 메타데이터 정보를 저장한다.
-위젯은 minWidth/minHeight가 가장 중요하다 해당 프로퍼티를 기준으로 1x1가 될지 1x3이 될지 결정한다
-1by 당 72dp로 잡아서 계산하였다.
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="72dp"
android:minHeight="72dp"
android:updatePeriodMillis="86400000"
android:previewImage="@drawable/ic_launcher_foreground"
android:initialLayout="@layout/widget1x1__provider"
android:resizeMode="horizontal|vertical"
android:widgetCategory="home_screen">
</appwidget-provider>
#Widget1x1__provider.xml
-위젯뷰의 레이아웃이다
-이미지뷰 1개를 가득 채워서 노출시키고있다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/llRoot2"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="72dp"
android:layout_height="72dp"
android:orientation="horizontal"
android:background="@color/white"
>
<ImageView
android:id="@+id/img1"
android:layout_width="72dp"
android:layout_height="72dp"
android:src="@drawable/img_1x1_1"
android:layout_gravity="center_vertical"
/>
</LinearLayout>
#Widget1x1_Provider.Java
-초기화 시점에서 타이머를 이용하여, 화면을 시퀀싱하기때문에 나머지 오버라이드 함수는 모두 제거하였다.
-위젯프로바이더 컴포넌트를 가져온다
-위젯프로바이더 뷰를 가져온다
-타이머를 돌려서 레이아웃에 이미지 객체의 이미지를 변경한다.
-위젯을 업데이트 한다.
public class Widget1x1_Provider extends AppWidgetProvider {
Integer cnt =0;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
ComponentName widget = new ComponentName(context,Widget1x1_Provider.class);
for (int appWidgetId : appWidgetIds) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget1x1__provider);
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
cnt++;
cnt=cnt%5;
switch (cnt){
case 1:
views.setImageViewResource(R.id.img1,R.drawable.img_1x1_1);
break;
case 2:
views.setImageViewResource(R.id.img1,R.drawable.img_1x1_2);
break;
case 3:
views.setImageViewResource(R.id.img1,R.drawable.img_1x1_3);
break;
case 4:
views.setImageViewResource(R.id.img1,R.drawable.img_1x1_4);
break;
case 5:
views.setImageViewResource(R.id.img1,R.drawable.img_1x1_5);
break;
default:
break;
}
appWidgetManager.updateAppWidget(widget,views);
}
};
Timer timer = new Timer();
timer.schedule(timerTask,0,3000);
}
}
}
코틀린소스로 구현되어있는것도 존재한다, 다만 깃헙에 따로 올리진 않았으니 필요하다면 리플을 달아주세요
#소스경로
https://github.com/gofogo2/ImageWidget.git
#java #android #kotlin #widget #안드로이드 #위젯 #이미지루핑 #이미지시퀀스 #타이머 #여러개위젯
'Java(자바)안드로이드' 카테고리의 다른 글
[spring/java/android]split(".") . 문자열 필터가 잘 되지 않을때 (0) | 2022.10.13 |
---|---|
[android/orientation] android orientation 정보 가져오기(LANDSCAPE 가로/PORTRAIT 세로) (0) | 2022.07.19 |
[android/java]TedPermission을 통한 간단한 권한 설정 (2) | 2022.02.22 |
[android/java] startActivityForResult deprecated, ActivityResultLauncher 으로 대체 (0) | 2022.02.21 |
[android/java] 앱 권한 요청하기(requestPermissions) (0) | 2022.02.16 |