Skip to content

Commit 2df813b

Browse files
committed
added circle thumbnails and minimal circle thumbnails
1 parent 397568d commit 2df813b

16 files changed

+556
-5
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
3+
<shape xmlns:android="http://schemas.android.com/apk/res/android"
4+
android:shape="oval">
5+
<solid android:color="@color/bthumbnail_placeholder"/>
6+
</shape>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<selector xmlns:android="http://schemas.android.com/apk/res/android">
3+
4+
<item>
5+
<shape
6+
android:shape="oval">
7+
<solid android:color="@color/bthumbnail_background" />
8+
<stroke android:width="1dp" android:color="@color/bthumbnail_border" />
9+
</shape>
10+
</item>
11+
12+
</selector>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<selector xmlns:android="http://schemas.android.com/apk/res/android">
3+
4+
<item>
5+
<shape
6+
android:shape="oval">
7+
<solid android:color="@color/bthumbnail_background" />
8+
</shape>
9+
</item>
10+
11+
</selector>

AndroidBootstrap/res/layout/bootstrap_thumbnail.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
android:layout_height="wrap_content"
55
android:id="@+id/container"
66
android:duplicateParentState="true"
7-
android:padding="@dimen/bthumbnail_padding"
7+
android:padding="@dimen/padding_small"
88
android:orientation="horizontal">
99

1010
<LinearLayout
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:layout_width="wrap_content"
4+
android:layout_height="wrap_content"
5+
android:id="@+id/container"
6+
android:duplicateParentState="true"
7+
android:orientation="horizontal">
8+
9+
<LinearLayout
10+
android:layout_width="match_parent"
11+
android:layout_height="match_parent"
12+
android:id="@+id/placeholder"
13+
android:orientation="vertical"
14+
android:gravity="center">
15+
16+
<ImageView
17+
android:layout_height="wrap_content"
18+
android:layout_width="wrap_content"
19+
android:id="@+id/image"/>
20+
21+
<com.beardedhen.androidbootstrap.utils.AutoResizeTextView
22+
android:id="@+id/dimensionsLabel"
23+
android:layout_width="match_parent"
24+
android:layout_height="100dp"
25+
android:ellipsize="none"
26+
android:gravity="center"
27+
android:maxLines="1"
28+
android:textSize="100sp"
29+
android:textColor="@color/bthumbnail_font"/>
30+
31+
</LinearLayout>
32+
</LinearLayout>

AndroidBootstrap/res/values/attrs.xml

+7
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@
3838
<attr name="bt_inside_padding" format="dimension"/>
3939
<attr name="android:text"/>
4040
</declare-styleable>
41+
42+
<declare-styleable name="BootstrapCircleThumbnail">
43+
<attr name="bct_image" format="integer"/>
44+
<attr name="bct_size" format="string" />
45+
<attr name="bct_minimal" format="boolean" />
46+
<attr name="android:text"/>
47+
</declare-styleable>
4148

4249
</resources>
4350

AndroidBootstrap/res/values/dimens.xml

+6-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
<dimen name="activity_horizontal_margin">16dp</dimen>
55
<dimen name="activity_vertical_margin">16dp</dimen>
66
<dimen name="bbuton_rounded_corner_radius">5dp</dimen>
7-
<dimen name="bthumbnail_padding">8dp</dimen>
7+
88
<dimen name="bthumbnail_rounded_corner_radius">3dp</dimen>
9+
10+
<dimen name="padding_micro">4dp</dimen>
11+
<dimen name="padding_small">8dp</dimen>
12+
<dimen name="padding_medium">12dp</dimen>
13+
<dimen name="padding_large">16dp</dimen>
914
</resources>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
1+
package com.beardedhen.androidbootstrap;
2+
3+
import android.content.Context;
4+
import android.content.res.TypedArray;
5+
import android.graphics.Bitmap;
6+
import android.graphics.BitmapFactory;
7+
import android.util.AttributeSet;
8+
import android.util.DisplayMetrics;
9+
import android.view.LayoutInflater;
10+
import android.view.View;
11+
import android.widget.FrameLayout;
12+
import android.widget.ImageView;
13+
import android.widget.LinearLayout;
14+
import android.widget.TextView;
15+
16+
import com.beardedhen.androidbootstrap.utils.ImageUtils;
17+
18+
public class BootstrapCircleThumbnail extends FrameLayout
19+
{
20+
private static final int PADDING_SMALL = 4;
21+
private static final int PADDING_MEDIUM = 4;
22+
private static final int PADDING_LARGE = 6;
23+
private static final int PADDING_XLARGE = 8;
24+
25+
private static final int SIZE_SMALL = 48; //dp total size (outer circle)
26+
private static final int SIZE_MEDIUM = 80;//dp
27+
private static final int SIZE_LARGE = 112;//dp
28+
private static final int SIZE_XLARGE = 176;//dp
29+
private static final int SIZE_DEFAULT = SIZE_MEDIUM;
30+
31+
private static final String SMALL = "small";
32+
private static final String MEDIUM = "medium";
33+
private static final String LARGE = "large";
34+
private static final String XLARGE = "xlarge";
35+
36+
37+
private static final int DEFAULT_IMAGE_WIDTH = 400;//px, size when no image is given
38+
private static final int DEFAULT_IMAGE_HEIGHT = 400;//px, size when no image is given
39+
40+
private LinearLayout container;
41+
private LinearLayout placeholder;
42+
private ImageView image;
43+
private TextView dimensionsLabel;
44+
private String size = MEDIUM;
45+
private boolean minimal = false;//minimal means display just the image, no padding
46+
private String text = "";
47+
private int imageWidth = SIZE_DEFAULT;
48+
private int imageHeight = SIZE_DEFAULT;
49+
private int padding = 0;
50+
51+
public BootstrapCircleThumbnail(Context context, AttributeSet attrs, int defStyle)
52+
{
53+
super(context, attrs, defStyle);
54+
initialise(attrs);
55+
}
56+
57+
public BootstrapCircleThumbnail(Context context, AttributeSet attrs)
58+
{
59+
super(context, attrs);
60+
initialise(attrs);
61+
}
62+
63+
public BootstrapCircleThumbnail(Context context)
64+
{
65+
super(context);
66+
initialise(null);
67+
}
68+
69+
private void initialise( AttributeSet attrs )
70+
{
71+
LayoutInflater inflator = (LayoutInflater)getContext().getSystemService(
72+
Context.LAYOUT_INFLATER_SERVICE);
73+
74+
75+
TypedArray a = getContext().obtainStyledAttributes(attrs,
76+
R.styleable.BootstrapCircleThumbnail);
77+
78+
79+
int imageDrawable = 0;
80+
81+
if(a.getString(R.styleable.BootstrapCircleThumbnail_bct_image) != null)
82+
{
83+
imageDrawable = a.getResourceId(R.styleable.BootstrapCircleThumbnail_bct_image, 0);
84+
85+
}
86+
87+
if(a.getString(R.styleable.BootstrapCircleThumbnail_android_text) != null)
88+
{
89+
text = a.getString(R.styleable.BootstrapCircleThumbnail_android_text);
90+
}
91+
92+
if(a.getString(R.styleable.BootstrapCircleThumbnail_bct_size) != null)
93+
{
94+
this.size = a.getString(R.styleable.BootstrapCircleThumbnail_bct_size);
95+
}
96+
97+
if(a.getString(R.styleable.BootstrapCircleThumbnail_bct_minimal) != null)
98+
{
99+
this.minimal = a.getBoolean(R.styleable.BootstrapCircleThumbnail_bct_minimal, false);
100+
}
101+
102+
a.recycle();
103+
104+
View v = inflator.inflate(R.layout.bootstrap_thumbnail_circle, null, false);
105+
dimensionsLabel = (TextView) v.findViewById(R.id.dimensionsLabel);
106+
container = (LinearLayout) v.findViewById(R.id.container);
107+
placeholder = (LinearLayout) v.findViewById(R.id.placeholder);
108+
image = (ImageView) v.findViewById(R.id.image);
109+
float scale = getResources().getDisplayMetrics().density;
110+
111+
112+
113+
//small image
114+
if(this.size.equals(SMALL))
115+
{
116+
padding = PADDING_SMALL;
117+
imageWidth = SIZE_SMALL;
118+
imageHeight = SIZE_SMALL;
119+
120+
}
121+
else if(this.size.equals(MEDIUM))
122+
{
123+
padding = PADDING_MEDIUM;
124+
imageWidth = SIZE_MEDIUM;
125+
imageHeight = SIZE_MEDIUM;
126+
}
127+
else if(this.size.equals(LARGE))
128+
{
129+
padding = PADDING_LARGE;
130+
imageWidth = SIZE_LARGE;
131+
imageHeight = SIZE_LARGE;
132+
}
133+
else if(this.size.equals(XLARGE))
134+
{
135+
padding = PADDING_XLARGE;
136+
imageWidth = SIZE_XLARGE;
137+
imageHeight = SIZE_XLARGE;
138+
}
139+
//no valid size is given, set image to default size
140+
else
141+
{
142+
padding = PADDING_MEDIUM;
143+
imageWidth = SIZE_DEFAULT;
144+
imageHeight = SIZE_DEFAULT;
145+
}
146+
147+
//convert padding to pixels
148+
DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
149+
int paddingPX = (int)((padding * scale) + 0.5);
150+
151+
//convert image size to pixels
152+
int imageSizeWidthPX = (int)((imageWidth * scale) + 0.5);
153+
int imageSizeHeightPX = (int)((imageHeight * scale) + 0.5);
154+
155+
//make inner image smaller to compensate for the padding so that entire circle including padding equals the size
156+
//ex. small image = 48dp, small padding = 4dp, inner image = 48 - (4 * 2) = 40
157+
if(this.minimal == false)
158+
{
159+
imageSizeWidthPX = imageSizeWidthPX - (paddingPX * 2);
160+
imageSizeHeightPX = imageSizeHeightPX - (paddingPX * 2);
161+
162+
this.container.setPadding(paddingPX, paddingPX, paddingPX, paddingPX);
163+
container.setBackgroundResource(R.drawable.thumbnail_circle_container);
164+
}
165+
else
166+
{
167+
container.setBackgroundResource(R.drawable.thumbnail_circle_minimal);
168+
}
169+
170+
//if no image is given
171+
if(imageDrawable == 0)
172+
{
173+
this.image.setVisibility(View.GONE);
174+
placeholder.setLayoutParams(new LinearLayout.LayoutParams(imageSizeWidthPX, imageSizeHeightPX));
175+
placeholder.setPadding(paddingPX, paddingPX, paddingPX, paddingPX);
176+
177+
//set placeholder image
178+
placeholder.setBackgroundResource(R.drawable.thumbnail_circle);
179+
180+
this.dimensionsLabel.setText(text);
181+
}
182+
else
183+
{
184+
placeholder.setPadding(0, 0, 0, 0);
185+
this.dimensionsLabel.setVisibility(View.GONE);
186+
Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(), imageDrawable);
187+
188+
Bitmap roundBitmap = ImageUtils.getCircleBitmap(bitmap, imageSizeWidthPX, imageSizeHeightPX);
189+
image.setImageBitmap(roundBitmap);
190+
}
191+
192+
this.addView(v);
193+
}
194+
195+
public void setImage(int drawable)
196+
{
197+
Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(), drawable);
198+
199+
float scale = getResources().getDisplayMetrics().density;
200+
201+
//convert image size to pixels
202+
int widthPX = (int)((this.imageWidth * scale) + 0.5);
203+
int heightPX = (int)((this.imageHeight * scale) + 0.5);
204+
205+
int paddingPX = (int)((this.padding * scale) + 0.5);
206+
207+
if(this.minimal == false)
208+
{
209+
widthPX = widthPX - (paddingPX * 2);
210+
heightPX = heightPX - (paddingPX * 2);
211+
}
212+
213+
Bitmap roundBitmap = ImageUtils.getCircleBitmap(bitmap, widthPX, heightPX);
214+
image.setImageBitmap(roundBitmap);
215+
216+
invalidate();
217+
requestLayout();
218+
}
219+
}

AndroidBootstrap/src/com/beardedhen/androidbootstrap/BootstrapThumbnail.java

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.util.HashMap;
44
import java.util.Map;
5-
65
import android.content.Context;
76
import android.content.res.TypedArray;
87
import android.graphics.Typeface;

0 commit comments

Comments
 (0)