diff options
Diffstat (limited to 'libraries/AndroidBootstrap/src/com/beardedhen/androidbootstrap/BootstrapCircleThumbnail.java')
| -rw-r--r-- | libraries/AndroidBootstrap/src/com/beardedhen/androidbootstrap/BootstrapCircleThumbnail.java | 215 | 
1 files changed, 215 insertions, 0 deletions
| diff --git a/libraries/AndroidBootstrap/src/com/beardedhen/androidbootstrap/BootstrapCircleThumbnail.java b/libraries/AndroidBootstrap/src/com/beardedhen/androidbootstrap/BootstrapCircleThumbnail.java new file mode 100644 index 000000000..1eb353770 --- /dev/null +++ b/libraries/AndroidBootstrap/src/com/beardedhen/androidbootstrap/BootstrapCircleThumbnail.java @@ -0,0 +1,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(); +    } +} | 
