Android Story

[ Android ] 마커 이미지에 인덱스 합성

WhiteDuck 2016. 11. 26. 21:27

이미지 & 텍스트 합성



화면 크기별로 구분하여 마커 이미지에 인덱스를 합성한다.


합성할 때 번호의 숫자에 따라서 크기를 조절할 수 있도록 설정하였다.




    private static final float DEFAULT_TEXT_SIZE = 50; // xxxhdpi 기준
    private static final float XXXHDPI = 640;
    private static final boolean DBG = false;

    /**
     * 리소스 Drawable 위에 텍스트 설정
     * @param context       리소스를 가져올 context
     * @param drawableId    리소스 아이디
     * @param text          합칠 텍스트
     * @return BitmapDrawable  합친 이미지
     */
    public static BitmapDrawable writeOnDrawable(Context context, int drawableId, String text){

        // dpi 측정
        DisplayMetrics metrics = new DisplayMetrics();
        WindowManager mgr = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
        mgr.getDefaultDisplay().getMetrics(metrics);

        // dpi에 따른 텍스트 기본 크기 설정
        final float dpi_text_size = metrics.densityDpi * DEFAULT_TEXT_SIZE / XXXHDPI ;

        // 텍스트 길이에 따른 텍스트 크기 설정 ( 3자리 이상은 힘듬 )
        final float textSize = dpi_text_size  - ( dpi_text_size / 4f * ( text.length() - 1) );

        // 마커 이미지
        Bitmap bm = BitmapFactory.decodeResource(context.getResources(), drawableId).copy(Bitmap.Config.ARGB_8888, true);

        // 텍스트 스타일
        Paint paint = new Paint();
        paint.setStyle(Paint.Style.FILL);
        paint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD));
        paint.setColor(Color.WHITE);
        paint.setTextSize(textSize);

        // 텍스트 위치 (가운데 정렬)
        final float textPositionX =  ( bm.getWidth() - paint.measureText(text) ) / 2f;
        final float addAlpha = DEFAULT_TEXT_SIZE / 6 * metrics.densityDpi / XXXHDPI;
        final float textPositionY =   bm.getHeight()/2 + ( text.length() == 1 ? addAlpha : 0);

        // 텍스트 입력
        Canvas canvas = new Canvas(bm);
        canvas.drawText(text, textPositionX , textPositionY, paint);

        return new BitmapDrawable(bm);
    }


반응형