mirror of
https://github.com/moparisthebest/open-keychain
synced 2024-12-18 05:12:16 -05:00
216 lines
7.1 KiB
Java
216 lines
7.1 KiB
Java
|
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();
|
||
|
}
|
||
|
}
|