티스토리 뷰

반응형

[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

 

GitHub - gofogo2/ImageWidget: 안드로이드 이미지 위젯 1x1 3x1 구현

안드로이드 이미지 위젯 1x1 3x1 구현. Contribute to gofogo2/ImageWidget development by creating an account on GitHub.

github.com

 

 

GitHub - gofogo2/ImageWidget: 안드로이드 이미지 위젯 1x1 3x1 구현

안드로이드 이미지 위젯 1x1 3x1 구현. Contribute to gofogo2/ImageWidget development by creating an account on GitHub.

github.com

 

 

 

#java #android #kotlin #widget #안드로이드 #위젯 #이미지루핑 #이미지시퀀스 #타이머 #여러개위젯

반응형
댓글
반응형