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.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; import com.hoollyzhang.hlib.R; public class BootstrapCircleThumbnail extends FrameLayout { private enum BootstrapCircleType { SMALL("small", 2, 48), //padding adjustment for small thumbnails MEDIUM("medium", 4, 80), LARGE("large", 6, 112), XLARGE("xlarge", 8, 176); private final String type; private final int padding; private final int diameter; private BootstrapCircleType(String type, int padding, int diameter) { this.type = type; this.padding = padding; this.diameter = diameter; } public int getDiameter() { // dp return diameter; } public int getPadding() { return padding; } public static BootstrapCircleType getBootstrapCircleTypeFromString(String type) { for (BootstrapCircleType value : BootstrapCircleType.values()) { if (value.type.equals(type)) { return value; } } return MEDIUM; } } private ImageView image; private boolean minimal = false;//minimal means display just the image, no padding private int imageWidth; private int imageHeight; private int padding = 0; private LinearLayout placeholder; private TextView dimensionsLabel; public BootstrapCircleThumbnail(Context context) { super(context); initialise(null); } public BootstrapCircleThumbnail(Context context, AttributeSet attrs) { super(context, attrs); initialise(attrs); } public BootstrapCircleThumbnail(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initialise(attrs); } private void initialise(AttributeSet attrs) { LayoutInflater inflater = LayoutInflater.from(getContext()); TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.BootstrapCircleThumbnail); String size = ""; String text = ""; int imageDrawable = 0; try { if (a != null) { imageDrawable = a.getResourceId(R.styleable.BootstrapCircleThumbnail_bct_image, 0); text = a.getString(R.styleable.BootstrapCircleThumbnail_android_text); text = (text == null) ? "" : text; size = a.getString(R.styleable.BootstrapCircleThumbnail_bct_size); size = (size == null) ? "" : size; minimal = a.getBoolean(R.styleable.BootstrapCircleThumbnail_bct_minimal, false); } } finally { if (a != null) { a.recycle(); } } View v = inflater.inflate(R.layout.bootstrap_thumbnail_circle, this, false); dimensionsLabel = (TextView) v.findViewById(R.id.dimensionsLabel); LinearLayout 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 BootstrapCircleType type = BootstrapCircleType.getBootstrapCircleTypeFromString(size); padding = type.getPadding(); imageWidth = type.getDiameter(); imageHeight = type.getDiameter(); //convert padding to pixels 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) { imageSizeWidthPX -= (paddingPX * 2); imageSizeHeightPX -= (paddingPX * 2); 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); dimensionsLabel.setText(text); } else { placeholder.setPadding(0, 0, 0, 0); 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); setImage(bitmap); } public void setImage(Bitmap bitmap) { placeholder.setPadding(0, 0, 0, 0); this.dimensionsLabel.setVisibility(View.GONE); this.image.setVisibility(View.VISIBLE); 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) { widthPX -= (paddingPX * 2); heightPX -= (paddingPX * 2); } Bitmap roundBitmap = ImageUtils.getCircleBitmap(bitmap, widthPX, heightPX); image.setVisibility(View.VISIBLE); image.setImageBitmap(roundBitmap); requestLayout(); invalidate(); } }