aboutsummaryrefslogtreecommitdiffstats
path: root/libraries/AndroidBootstrap/src/com/generated by cgit v1.2.3 (git 2.25.1) at 2025-05-22 03:10:32 +0000
>170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
package com.beardedhen.androidbootstrap;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.beardedhen.androidbootstrap.utils.ImageUtils;

public class BootstrapCircleThumbnail extends FrameLayout
{
    private static final int PADDING_SMALL = 4;
    private static final int PADDING_MEDIUM = 4;
    private static final int PADDING_LARGE = 6;
    private static final int PADDING_XLARGE = 8;

    private static final int SIZE_SMALL = 48; //dp total size (outer circle)
    private static final int SIZE_MEDIUM = 80;//dp
    private static final int SIZE_LARGE = 112;//dp
    private static final int SIZE_XLARGE = 176;//dp
    private static final int SIZE_DEFAULT = SIZE_MEDIUM;

    private static final String SMALL = "small";
    private static final String MEDIUM = "medium";
    private static final String LARGE = "large";
    private static final String XLARGE = "xlarge";

    private LinearLayout container;
    private LinearLayout placeholder;
    private ImageView image;
    private TextView dimensionsLabel;
    private String size = MEDIUM;
    private boolean minimal = false;//minimal means display just the image, no padding
    private String text = "";
    private int imageWidth = SIZE_DEFAULT;
    private int imageHeight = SIZE_DEFAULT;
    private int padding = 0;

    public BootstrapCircleThumbnail(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        initialise(attrs);
    }

    public BootstrapCircleThumbnail(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        initialise(attrs);
    }

    public BootstrapCircleThumbnail(Context context)
    {
        super(context);
        initialise(null);
    }

    private void initialise( AttributeSet attrs )
    {
        LayoutInflater inflator = (LayoutInflater)getContext().getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);


        TypedArray a = getContext().obtainStyledAttributes(attrs,
                R.styleable.BootstrapCircleThumbnail);


        int imageDrawable = 0;

        if(a.getString(R.styleable.BootstrapCircleThumbnail_bct_image) != null)
        {
            imageDrawable = a.getResourceId(R.styleable.BootstrapCircleThumbnail_bct_image, 0);

        }

        if(a.getString(R.styleable.BootstrapCircleThumbnail_android_text) != null)
        {
            text = a.getString(R.styleable.BootstrapCircleThumbnail_android_text);
        }

        if(a.getString(R.styleable.BootstrapCircleThumbnail_bct_size) != null)
        {
            this.size = a.getString(R.styleable.BootstrapCircleThumbnail_bct_size);
        }

        if(a.getString(R.styleable.BootstrapCircleThumbnail_bct_minimal) != null)
        {
            this.minimal = a.getBoolean(R.styleable.BootstrapCircleThumbnail_bct_minimal, false);
        }

        a.recycle();

        View v = inflator.inflate(R.layout.bootstrap_thumbnail_circle, null, false);
        dimensionsLabel = (TextView) v.findViewById(R.id.dimensionsLabel);
        container = (LinearLayout) v.findViewById(R.id.container);
        placeholder = (LinearLayout) v.findViewById(R.id.placeholder);
        image = (ImageView) v.findViewById(R.id.image);
        float scale = getResources().getDisplayMetrics().density;



        //small image
        if(this.size.equals(SMALL))
        {
            padding = PADDING_SMALL;
            imageWidth = SIZE_SMALL;
            imageHeight = SIZE_SMALL;

        }
        else if(this.size.equals(MEDIUM))
        {
            padding = PADDING_MEDIUM;
            imageWidth = SIZE_MEDIUM;
            imageHeight = SIZE_MEDIUM;
        }
        else if(this.size.equals(LARGE))
        {
            padding = PADDING_LARGE;
            imageWidth = SIZE_LARGE;
            imageHeight = SIZE_LARGE;
        }
        else if(this.size.equals(XLARGE))
        {
            padding = PADDING_XLARGE;
            imageWidth = SIZE_XLARGE;
            imageHeight = SIZE_XLARGE;
        }
        //no valid size is given, set image to default size
        else
        {
            padding = PADDING_MEDIUM;
            imageWidth = SIZE_DEFAULT;
            imageHeight = SIZE_DEFAULT;
        }

        //convert padding to pixels
        DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
        int paddingPX = (int)((padding * scale) + 0.5);

        //convert image size to pixels
        int imageSizeWidthPX = (int)((imageWidth * scale) + 0.5);
        int imageSizeHeightPX = (int)((imageHeight * scale) + 0.5);

        //make inner image smaller to compensate for the padding so that entire circle including padding equals the size
        //ex. small image = 48dp, small padding = 4dp, inner image = 48 - (4 * 2) = 40
        if(this.minimal == false)
        {
            imageSizeWidthPX = imageSizeWidthPX - (paddingPX * 2);
            imageSizeHeightPX = imageSizeHeightPX - (paddingPX * 2);

            this.container.setPadding(paddingPX, paddingPX, paddingPX, paddingPX);
            container.setBackgroundResource(R.drawable.thumbnail_circle_container);
        }
        else
        {
            container.setBackgroundResource(R.drawable.thumbnail_circle_minimal);
        }

        //if no image is given
        if(imageDrawable == 0)
        {
            this.image.setVisibility(View.GONE);
            placeholder.setLayoutParams(new LinearLayout.LayoutParams(imageSizeWidthPX, imageSizeHeightPX));
            placeholder.setPadding(paddingPX, paddingPX, paddingPX, paddingPX);

            //set placeholder image
            placeholder.setBackgroundResource(R.drawable.thumbnail_circle);

            this.dimensionsLabel.setText(text);
        }
        else
        {
            placeholder.setPadding(0, 0, 0, 0);
            this.dimensionsLabel.setVisibility(View.GONE);
            Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(), imageDrawable);

            Bitmap roundBitmap = ImageUtils.getCircleBitmap(bitmap, imageSizeWidthPX, imageSizeHeightPX);
            image.setImageBitmap(roundBitmap);
        }

        this.addView(v);
    }

    public void setImage(int drawable)
    {
        Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(), drawable);

        float scale = getResources().getDisplayMetrics().density;

        //convert image size to pixels
        int widthPX = (int)((this.imageWidth * scale) + 0.5);
        int heightPX = (int)((this.imageHeight * scale) + 0.5);

        int paddingPX = (int)((this.padding * scale) + 0.5);

        if(this.minimal == false)
        {
            widthPX = widthPX - (paddingPX * 2);
            heightPX = heightPX - (paddingPX * 2);
        }

        Bitmap roundBitmap = ImageUtils.getCircleBitmap(bitmap, widthPX, heightPX);
        image.setImageBitmap(roundBitmap);

        invalidate();
        requestLayout();
    }
}