한 걸음 두 걸음

Android 안드로이드 ] 홈 화면에 이미지 뷰 위젯 만들기 본문

FrontEnd/Android

Android 안드로이드 ] 홈 화면에 이미지 뷰 위젯 만들기

언제나 변함없이 2019. 7. 25. 12:33
반응형

안드로이드 스튜디오에서

위젯으로 만들어주면 바로 만들어줌.

이제 핸드폰에 RUN 설치 후, 홈화면 꾹 눌러서 위젯 추가해주면 됨.

여기서 위젯 이미지를 설정하는데 imageView를 넣으려면

app:srcCompat이 아니라, android:src 로 해주어야 표시됨!! 중요

버튼의 경우, 위젯에서 클릭을 인식하게 하려면 menifest파일을 수정해주어야한다.

자신의 폴더 이름과 버튼 이름으로 구성된 ACTION이다.

클릭이벤트에 대한 것은 다음에 할꼐.. https://m.blog.naver.com/cosmosjs/221299199145

필요하면 여기 보고 해봐 잘 나와있어 ㅎㅎ

소스로 이미지 변경(외부저장소에 있는 이미지 가져와서 이미지뷰에 등록하기)

views.setImageViewBitmap(R.id.widget_imageview,BitmapFactory.decodeFile( Environment.getExternalStorageDirectory().toString() + "/test.png"));

 

이미지 대체는

// views.setImageViewResource(R.id.widget_imageview, R.drawable.testimage);

업데이트 주기 설정

updatePeriodMillis는 ms단위로 기본 86400000ms 즉 24시간이 설정되어있다.

최소 설정시간은 30분이다. 즉 1800000ms(30분)

0으로 설정하면 갱신 안함-_-

30분 이내로 설정하고싶다면 http://theeye.pe.kr/archives/1324 참고

참고 : 공식문서 https://developer.android.com/guide/topics/appwidgets#Basics

불러오는 중입니다...

소스코드

package com.androidtutorialshub;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.view.Display;
import android.view.WindowManager;
import android.widget.RemoteViews;

import com.androidtutorialshub.helper.FileUtil;
import com.androidtutorialshub.screenshot.R;

import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * Implementation of App Widget functionality.
 */
public class NewAppWidget extends AppWidgetProvider {

    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                                int appWidgetId) {

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);
       // views.setImageViewResource(R.id.widget_imageview, R.drawable.testimage);

        views.setImageViewBitmap(R.id.widget_imageview,BitmapFactory.decodeFile( Environment.getExternalStorageDirectory().toString() + "/test.png"));
//        try {
//            views.setImageViewBitmap(R.id.widget_imageview, loadBackgroundBitmap(context, Environment.getExternalStorageDirectory().toString() + "/test.png"));
//        }catch (Exception e){
//            e.printStackTrace();
//        }
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        // There may be multiple widgets active, so update all of them
        for (int appWidgetId : appWidgetIds) {
            updateAppWidget(context, appWidgetManager, appWidgetId);
        }
    }

    @Override
    public void onEnabled(Context context) {
        // Enter relevant functionality for when the first widget is created
    }

    @Override
    public void onDisabled(Context context) {
        // Enter relevant functionality for when the last widget is disabled
    }

    /**
     * 지정한 패스의 파일을 읽어서 Bitmap을 리턴 (화면사이즈에 최다한 맞춰서 리스케일한다.)
     *
     * @param context
     * application context
     * @param imgFilePath
     * bitmap file path
     * @return Bitmap
     * @throws IOException
     */
    public static Bitmap loadBackgroundBitmap(Context context,
                                              String imgFilePath) throws Exception, OutOfMemoryError, IOException {
//        if (!FileUtil.exists(imgFilePath)) {
//            throw new FileNotFoundException("background-image file not found : " + imgFilePath);
//        }
        // 폰의 화면 사이즈를 구한다.
        Display display = ((WindowManager) context
                .getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        int displayWidth = display.getWidth();
        int displayHeight = display.getHeight();
        // 읽어들일 이미지의 사이즈를 구한다.
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(imgFilePath, options);
        // 화면 사이즈에 가장 근접하는 이미지의 리스케일 사이즈를 구한다.
        // 리스케일의 사이즈는 짝수로 지정한다. (이미지 손실을 최소화하기 위함.)
        float widthScale = options.outWidth / displayWidth;
        float heightScale = options.outHeight / displayHeight;
        float scale = widthScale > heightScale ? widthScale : heightScale;

        if(scale >= 8) {
            options.inSampleSize = 8;
        } else if(scale >= 6) {
            options.inSampleSize = 6;
        } else if(scale >= 4) {
            options.inSampleSize = 4;
        } else if(scale >= 2) {
            options.inSampleSize = 2;
        } else {
            options.inSampleSize = 1;
        }
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeFile(imgFilePath, options);
    }

}

반응형