私はImageView
からのどんな画像でもボーダー付きの円形にしたいです。
私は検索しましたが、有用な情報が見つかりませんでした(試したものではうまくいきませんでした)。
どのように私はxmlを通してこれを達成することができます:特定のsrcでImageView
を作成して、それを境界で円形にしますか?
あなたは白い枠と透明な内容を持つ単純な円を形で作ることができます。
// res/drawable/circle.xml
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:innerRadius="0dp"
Android:shape="ring"
Android:thicknessRatio="1.9"
Android:useLevel="false" >
<solid Android:color="@Android:color/transparent" />
<stroke
Android:width="10dp"
Android:color="@Android:color/white" />
</shape>
次に、レイヤリストを描画可能にして、それをあなたのイメージビューの背景として置きます。
// res/drawable/img.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item Android:drawable="@drawable/ic_launcher"/>
<item Android:drawable="@drawable/circle"/>
</layer-list>
そしてそれをあなたのイメージビューの背景にします。
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:background="@drawable/img"/>
あなたはそのようなものがあるでしょう。
これが私が設計した最も簡単な方法です。これを試して。
dependencies: compile 'com.Android.support:appcompat-v7:23.1.1'
compile 'com.Android.support:design:23.1.1'
compile 'com.Android.support:cardview-v7:23.1.1'
<Android.support.v7.widget.CardView
Android:layout_width="80dp"
Android:layout_height="80dp"
Android:elevation="12dp"
Android:id="@+id/view2"
app:cardCornerRadius="40dp"
Android:layout_centerHorizontal="true"
Android:innerRadius="0dp"
Android:shape="ring"
Android:thicknessRatio="1.9">
<ImageView
Android:layout_height="80dp"
Android:layout_width="match_parent"
Android:id="@+id/imageView1"
Android:src="@drawable/YOUR_IMAGE"
Android:layout_alignParentTop="true"
Android:layout_centerHorizontal="true">
</ImageView>
</Android.support.v7.widget.CardView>
あなたがロリポップの上にAndroidのバージョンに取り組んでいる場合
<Android.support.v7.widget.CardView
Android:layout_width="80dp"
Android:layout_height="80dp"
Android:elevation="12dp"
Android:id="@+id/view2"
app:cardCornerRadius="40dp"
Android:layout_centerHorizontal="true">
<ImageView
Android:layout_height="80dp"
Android:layout_width="match_parent"
Android:id="@+id/imageView1"
Android:src="@drawable/YOUR_IMAGE"
Android:scaleType="centerCrop"/>
</Android.support.v7.widget.CardView>
これが役に立つことを願っています。
1)CircleImageView
<de.hdodenhof.circleimageview.CircleImageView
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/profile_image"
Android:layout_width="96dp"
Android:layout_height="96dp"
Android:src="@drawable/profile"
app:civ_border_width="2dp"
app:civ_border_color="#FF000000"/>
実装を忘れないでください。Gradle Scripts> build.gradle(Module:app)>依存関係
implementation 'de.hdodenhof:circleimageview:3.0.0'
詳しい説明は The Source here。 をチェックしてください。
2)CircularImageView
<com.mikhaellopez.circularimageview.CircularImageView
Android:layout_width="250dp"
Android:layout_height="250dp"
Android:src="@drawable/image"
app:civ_border_color="#EEEEEE"
app:civ_border_width="4dp"
app:civ_shadow="true"
app:civ_shadow_radius="10"
app:civ_shadow_color="#8BC34A"/>
実装を忘れないでください。Gradle Scripts> build.gradle(Module:app)>依存関係
implementation 'com.mikhaellopez:circularimageview:3.2.0'
詳しい説明は The Source here。 をチェックしてください。
src
属性を使用している場合、上記の方法はうまくいかないようです。私がしたのは、このようにフレームレイアウト内に2つの画像ビューを上下に配置することです。
<FrameLayout Android:id="@+id/frame"
Android:layout_width="40dp"
Android:layout_height="40dp">
<ImageView Android:id="@+id/pic"
Android:layout_width="40dp"
Android:layout_height="40dp"
Android:src="@drawable/my_picture" />
<ImageView Android:id="@+id/circle_crop"
Android:layout_width="40dp"
Android:layout_height="40dp"
Android:src="@drawable/circle_crop" />
</FrameLayout>
単純にあなたの画像サイズ(私の場合は正方形)の形をした円形の中心と真ん中の透明な円で、あなたのdrawableフォルダの中にcircular_crop.pngを入れてください。正方形のイメージビューが必要な場合は、このイメージを使用できます。
上の写真をダウンロードするだけです。
glide libraryおよび RoundedBitmapDrawableFactory classの助けを借りて、簡単に達成できます。円形のプレースホルダー画像を作成する必要があるかもしれません。
グライドV4:
Glide.with(context).load(url).apply(RequestOptions.circleCropTransform()).into(imageView);
グライドV3:
Glide.with(context)
.load(imgUrl)
.asBitmap()
.placeholder(R.drawable.placeholder)
.error(R.drawable.placeholder)
.into(new BitmapImageViewTarget(imgProfilePicture) {
@Override
protected void setResource(Bitmap resource) {
RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory.create(context.getResources(),
Bitmap.createScaledBitmap(resource, 50, 50, false));
drawable.setCircular(true);
imgProfilePicture.setImageDrawable(drawable);
}
});
Picasso RoundedTransformation の場合、これは上または下のエッジで画像を丸めるという追加のオプションを提供する、非常に優れたソリューションです。
以下はそのための最も簡単な方法の1つです。次のコードを使用してください。
依存関係
dependencies {
...
compile 'de.hdodenhof:circleimageview:2.1.0' // use this or use the latest compile version. In case u get bug.
}
XMLコード
<de.hdodenhof.circleimageview.CircleImageView
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/profile_image"
Android:layout_width="96dp" // here u can adjust the width
Android:layout_height="96dp" // here u can adjust the height
Android:src="@drawable/profile" // here u can change the image
app:civ_border_width="2dp" // here u can adjust the border of the circle.
app:civ_border_color="#FF000000"/> // here u can adjust the border color
スクリーンショット:
下の "ring"の代わりにshape = "oval"を使います。それは私のために働きました。画像を境界内に収めるには、<padding>
を使用し、<adjustViewBounds>
で<ImageView>
をtrueに設定します。私は50 x 50ピクセルから200 x 200ピクセルまでのサイズの画像を試してみました。
これでうまくいくでしょう。
rectangle.xml
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle">
<solid Android:color="@Android:color/transparent" />
<padding Android:bottom="-14dp" Android:left="-14dp" Android:right="-14dp" Android:top="-14dp" />
</shape>
circle.xml
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:innerRadius="0dp"
Android:shape="oval"
Android:useLevel="false" >
<solid Android:color="@Android:color/transparent" />
<stroke
Android:width="15dp"
Android:color="@color/verification_contact_background" />
</shape>
profile_image.xml(レイヤーリスト)
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item Android:drawable="@drawable/rectangle" />
<item Android:drawable="@drawable/circle"/>
</layer-list>
あなたのレイアウト
<ImageView
Android:id="@+id/profile_image"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@drawable/default_org"
Android:src="@drawable/profile_image"/>
これらのコードを使用するだけで完了です。
<de.hdodenhof.circleimageview.CircleImageView
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:clickable="true"
app:civ_border_width="3dp"
app:civ_border_color="#FFFFFFFF"
Android:id="@+id/profile"
Android:layout_width="200dp"
Android:layout_height="200dp"
Android:layout_below="@+id/header_cover_image"
Android:layout_centerHorizontal="true"
Android:layout_marginTop="-130dp"
Android:elevation="5dp"
Android:padding="20dp"
Android:scaleType="centerCrop"
Android:src="@drawable/profilemain" />
インポートすることを忘れないでください:
import de.hdodenhof.circleimageview.CircleImageView;
このライブラリをbuild.gradleに追加します。
compile 'de.hdodenhof:circleimageview:2.1.0'
外部ライブラリなしでCardViewを使用できます
<androidx.cardview.widget.CardView
Android:id="@+id/roundCardView"
Android:layout_width="40dp"
Android:layout_height="40dp"
Android:layout_centerHorizontal="true"
Android:elevation="0dp"
app:cardCornerRadius="20dp">
<ImageView
Android:layout_width="40dp"
Android:layout_height="40dp"
Android:src="@drawable/profile" />
</androidx.cardview.widget.CardView>
@Jyotman Singhさん、答えは非常に良いです(純色の背景)、それであなたの必要性のために再着色することができるベクトルdrawableを共有することによってそれを高めたいと思います、そして.
これは長方形の円形です(@ drawable/shape_round_profile_pic)。
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:viewportWidth="284"
Android:viewportHeight="284"
Android:width="284dp"
Android:height="284dp">
<path
Android:pathData="M0 142L0 0l142 0 142 0 0 142 0 142 -142 0 -142 0zm165 137.34231c26.06742 -4.1212 52.67405 -17.543 72.66855 -36.65787 11.82805 -11.30768 20.55487 -22.85153 27.7633 -36.72531C290.23789 158.21592 285.62874 101.14121 253.48951 58.078079 217.58149 9.9651706 154.68849 -10.125717 98.348685 8.5190299 48.695824 24.95084 12.527764 67.047123 3.437787 118.98655 1.4806194 130.16966 1.511302 152.96723 3.4990422 164.5 12.168375 214.79902 47.646316 256.70775 96 273.76783c21.72002 7.66322 44.26673 9.48476 69 5.57448z"
Android:fillColor="#ffffff" /> // you can change frame color
</vector>
使い方は同じです。
<FrameLayout
Android:layout_width="70dp"
Android:layout_height="70dp">
<ImageView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@drawable/YOUR_PICTURE" />
<ImageView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@drawable/shape_round_profile_pic"/>
</FrameLayout>
このライブラリ (優れたドキュメントがあります)を使用し、画像を背景として追加します。
実際には、サードパーティのライブラリを使用する代わりに、GoogleがサポートライブラリRoundedBitmapDrawableFactoryクラス( here および here )を介して提供するものを使用できます。
Gradle:
implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val originalDrawable = ContextCompat.getDrawable(this, R.drawable.avatar_1)!!
val bitmap = convertDrawableToBitmap(originalDrawable)
val drawable = RoundedBitmapDrawableFactory.create(resources, bitmap)
drawable.setAntiAlias(true)
drawable.cornerRadius = Math.max(bitmap.width, bitmap.height) / 2.0f
avatarImageView.setImageDrawable(drawable)
}
companion object {
@JvmStatic
fun convertDrawableToBitmap(drawable: Drawable): Bitmap {
if (drawable is BitmapDrawable)
return drawable.bitmap
// We ask for the bounds if they have been set as they would be most
// correct, then we check we are > 0
val bounds = drawable.bounds
val width = if (!bounds.isEmpty) bounds.width() else drawable.intrinsicWidth
val height = if (!bounds.isEmpty) bounds.height() else drawable.intrinsicHeight
// Now we check we are > 0
val bitmap = Bitmap.createBitmap(if (width <= 0) 1 else width, if (height <= 0) 1 else height,
Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
drawable.setBounds(0, 0, canvas.width, canvas.height)
drawable.draw(canvas)
return bitmap
}
}
}
res/layout/activity_main.xml
<FrameLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android" xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools" Android:layout_width="match_parent"
Android:layout_height="match_parent" tools:context=".MainActivity">
<androidx.appcompat.widget.AppCompatImageView
Android:id="@+id/avatarImageView" Android:layout_width="100dp" Android:layout_height="100dp"
Android:layout_gravity="center"/>
</FrameLayout>
res/drawable/avatar_1.xml
<vector xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:width="128dp" Android:height="128dp"
Android:viewportHeight="128.0" Android:viewportWidth="128.0">
<path
Android:fillColor="#FF8A80" Android:pathData="M0 0h128v128h-128z"/>
<path
Android:fillColor="#FFE0B2"
Android:pathData="M36.3 94.8c6.4 7.3 16.2 12.1 27.3 12.4 10.7,-.3 20.3,-4.7 26.7,-11.6l.2.1c-17,-13.3,-12.9,-23.4,-8.5,-28.6 1.3,-1.2 2.8,-2.5 4.4,-3.9l13.1,-11c1.5,-1.2 2.6,-3 2.9,-5.1.6,-4.4,-2.5,-8.4,-6.9,-9.1,-1.5,-.2,-3 0,-4.3.6,-.3,-1.3,-.4,-2.7,-1.6,-3.5,-1.4,-.9,-2.8,-1.7,-4.2,-2.5,-7.1,-3.9,-14.9,-6.6,-23,-7.9,-5.4,-.9,-11,-1.2,-16.1.7,-3.3 1.2,-6.1 3.2,-8.7 5.6,-1.3 1.2,-2.5 2.4,-3.7 3.7l-1.8 1.9c-.3.3,-.5.6,-.8.8,-.1.1,-.2 0,-.4.2.1.2.1.5.1.6,-1,-.3,-2.1,-.4,-3.2,-.2,-4.4.6,-7.5 4.7,-6.9 9.1.3 2.1 1.3 3.8 2.8 5.1l11 9.3c1.8 1.5 3.3 3.8 4.6 5.7 1.5 2.3 2.8 4.9 3.5 7.6 1.7 6.8,-.8 13.4,-5.4 18.4,-.5.6,-1.1 1,-1.4 1.7,-.2.6,-.4 1.3,-.6 2,-.4 1.5,-.5 3.1,-.3 4.6.4 3.1 1.8 6.1 4.1 8.2 3.3 3 8 4 12.4 4.5 5.2.6 10.5.7 15.7.2 4.5,-.4 9.1,-1.2 13,-3.4 5.6,-3.1 9.6,-8.9 10.5,-15.2m-14.4,-49.8c.9 0 1.6.7 1.6 1.6 0 .9,-.7 1.6,-1.6 1.6,-.9 0,-1.6,-.7,-1.6,-1.6,-.1,-.9.7,-1.6 1.6,-1.6zm-25.7 0c.9 0 1.6.7 1.6 1.6 0 .9,-.7 1.6,-1.6 1.6,-.9 0,-1.6,-.7,-1.6,-1.6,-.1,-.9.7,-1.6 1.6,-1.6z"/>
<path
Android:fillColor="#E0F7FA"
Android:pathData="M105.3 106.1c-.9,-1.3,-1.3,-1.9,-1.3,-1.9l-.2,-.3c-.6,-.9,-1.2,-1.7,-1.9,-2.4,-3.2,-3.5,-7.3,-5.4,-11.4,-5.7 0 0 .1 0 .1.1l-.2,-.1c-6.4 6.9,-16 11.3,-26.7 11.6,-11.2,-.3,-21.1,-5.1,-27.5,-12.6,-.1.2,-.2.4,-.2.5,-3.1.9,-6 2.7,-8.4 5.4l-.2.2s-.5.6,-1.5 1.7c-.9 1.1,-2.2 2.6,-3.7 4.5,-3.1 3.9,-7.2 9.5,-11.7 16.6,-.9 1.4,-1.7 2.8,-2.6 4.3h109.6c-3.4,-7.1,-6.5,-12.8,-8.9,-16.9,-1.5,-2.2,-2.6,-3.8,-3.3,-5z"/>
<path
Android:fillColor="#444" Android:pathData="M76.3,47.5 m-2.0, 0 a 2.0,2.0 0 1,1 4.0,0 a2.0,2.0 0 1,1 -4.0,0"/>
<path
Android:fillColor="#444" Android:pathData="M50.7,47.6 m-2.0, 0 a 2.0,2.0 0 1,1 4.0,0 a2.0,2.0 0 1,1 -4.0,0"/>
<path
Android:fillColor="#444"
Android:pathData="M48.1 27.4c4.5 5.9 15.5 12.1 42.4 8.4,-2.2,-6.9,-6.8,-12.6,-12.6,-16.4 17.2 1.5 14.1,-9.4 14.1,-9.4,-1.4 5.5,-11.1 4.4,-11.1 4.4h-18.8c-1.7,-.1,-3.4 0,-5.2.3,-12.8 1.8,-22.6 11.1,-25.7 22.9 10.6,-1.9 15.3,-7.6 16.9,-10.2z"/>
</vector>
結果:
そして、その上に境界線を追加したいとします。これを使用することができます。
stroke_drawable.xml
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:shape="oval">
<stroke
Android:width="4dp" Android:color="@Android:color/black"/>
</shape>
そして、レイアウトXMLファイルのImageViewにAndroid:foreground="@drawable/stroke_drawable"
を追加すると、これが得られます。
私はどうやって影を追加するのかわからない(それは古いAndroidのバージョンでも動作するだろう)。 FloatingActionButton ( "com.google.Android.material:material" dependency から)を使用して、ビットマップをFAB自体に合わせることができませんでした。それがうまくいけば代わりにそれを使用するとさらに良いかもしれません。
編集:あなたが(API 21から利用可能)の高さの影を追加したい場合は、私が書いたものを少し変更することができます:
レイアウトXMLファイル内:
<androidx.appcompat.widget.AppCompatImageView Android:padding="4dp"
Android:id="@+id/avatarImageView" Android:layout_width="100dp" Android:layout_height="100dp" Android:elevation="8dp"
Android:layout_gravity="center" Android:background="@drawable/stroke_drawable" tools:srcCompat="@drawable/avatar_1"/>
CircularShadowViewOutlineProvider.kt
@TargetApi(Build.VERSION_CODES.Lollipop)
class CircularShadowViewOutlineProvider : ViewOutlineProvider() {
override fun getOutline(view: View, outline: Outline) {
val size = Math.max(view.width, view.height)
outline.setRoundRect(0, 0, size, size, size / 2f)
}
}
コード内:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop)
avatarImageView.outlineProvider = CircularShadowViewOutlineProvider()
結果:
この単純なコードを使用してください。まず依存関係を追加します。
implementation 'de.hdodenhof:circleimageview:2.2.0'
その後、XMLレイアウトに次のコードを追加します。 -
<de.hdodenhof.circleimageview.CircleImageView xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/Imgshaligram"
Android:layout_width="96dp"
Android:layout_height="96dp"
Android:src="@drawable/shaligram"
app:civ_border_color="#d1b1b1"
Android:foregroundGravity="center"/>
これを試して。
public class RoundedImageView extends Android.support.v7.widget.AppCompatImageView {
private int borderWidth = 4;
private int viewWidth;
private int viewHeight;
private Bitmap image;
private Paint paint;
private Paint paintBorder;
private BitmapShader shader;
public RoundedImageView(Context context)
{
super(context);
setup();
}
public RoundedImageView(Context context, AttributeSet attrs)
{
super(context, attrs);
setup();
}
public RoundedImageView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
setup();
}
private void setup()
{
Paint = new Paint();
Paint.setAntiAlias(true);
paintBorder = new Paint();
setBorderColor(Color.WHITE);
paintBorder.setAntiAlias(true);
this.setLayerType(LAYER_TYPE_SOFTWARE, paintBorder);
paintBorder.setShadowLayer(4.0f, 0.0f, 2.0f, Color.WHITE);
}
public void setBorderWidth(int borderWidth)
{
this.borderWidth = borderWidth;
this.invalidate();
}
public void setBorderColor(int borderColor)
{
if (paintBorder != null)
paintBorder.setColor(borderColor);
this.invalidate();
}
private void loadBitmap()
{
BitmapDrawable bitmapDrawable = (BitmapDrawable) this.getDrawable();
if (bitmapDrawable != null)
image = bitmapDrawable.getBitmap();
}
@SuppressLint("DrawAllocation")
@Override
public void onDraw(Canvas canvas)
{
loadBitmap();
if (image != null)
{
shader = new BitmapShader(Bitmap.createScaledBitmap(image, canvas.getWidth(), canvas.getHeight(), false), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
Paint.setShader(shader);
int circleCenter = viewWidth / 2;
canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter + borderWidth - 4.0f, paintBorder);
canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter - 4.0f, Paint);
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
int width = measureWidth(widthMeasureSpec);
int height = measureHeight(heightMeasureSpec, widthMeasureSpec);
viewWidth = width - (borderWidth * 2);
viewHeight = height - (borderWidth * 2);
setMeasuredDimension(width, height);
}
private int measureWidth(int measureSpec)
{
int result = 0;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
if (specMode == MeasureSpec.EXACTLY)
{
result = specSize;
}
else
{
// Measure the text
result = viewWidth;
}
return result;
}
private int measureHeight(int measureSpecHeight, int measureSpecWidth)
{
int result = 0;
int specMode = MeasureSpec.getMode(measureSpecHeight);
int specSize = MeasureSpec.getSize(measureSpecHeight);
if (specMode == MeasureSpec.EXACTLY)
{
result = specSize;
}
else
{
result = viewHeight;
}
return (result + 2);
}
}
そしてこのImageViewを以下のようなレイアウトで使います。
<com.app.Demo.RoundedImageView
Android:id="@+id/iv_profileImage"
Android:layout_width="70dp"
Android:layout_height="70dp"
Android:layout_centerHorizontal="true"
/>
簡単な解決策があります。パッケージ名を右クリックして、「新規」 - >「イメージ資産」を選択して、新しいイメージ資産を作成します。名前(任意の名前)とパス(システム内の画像の場所)を入力してください。次にNextをクリックしてFinishをクリックします。画像の名前を「img」と入力すると、「img_round」という名前の円形の画像がミップマップフォルダに自動的に作成されます。
その後、これを行います。
<ImageView
Android:layout_width="100dp"
Android:layout_height="100dp"
Android:src="@mipmap/img_round"/>
プレビューにはまだ長方形の画像が表示されることがあります。しかし、あなたがあなたのデバイス上でアプリを実行するならば、それはラウンドになるでしょう。
このクラスは影付き、ストローク付き、彩度付きのカスタムCircular Imageviewです。このカスタムCircular ImageViewを使用すると、半径付きの円形に画像を作成できます。 Circular Shadow ImageViewのための人このクラスで十分なGithubは必要ありません。
レイアウトにCircularImageViewを追加する
CircularImageView c=new CircularImageView(this,screen width,screen height,Bitmap myimage);
yourLayout.addView(c);**
public class CircularImageView extends Android.support.v7.widget.AppCompatImageView
{
private final Context context;
private final int width, height;
private final Paint paint;
private final Paint paintBorder,imagePaint;
private final Bitmap bitmap2;
private final Paint paint3;
private Bitmap bitmap;
private BitmapShader shader;
private float radius = 4.0f;
float x = 0.0f;
float y = 8.0f;
private float stroke;
private float strokeWidth = 0.0f;
private Bitmap bitmap3;
private int corner_radius=50;
public CircularImageView(Context context, int width, int height, Bitmap bitmap) {
super(context);
this.context = context;
this.width = width;
this.height = height;
//here "bitmap" is the square shape(width* width) scaled bitmap ..
this.bitmap = bitmap;
Paint = new Paint(Paint.ANTI_ALIAS_FLAG);
Paint.setAntiAlias(true);
Paint.setFilterBitmap(true);
Paint.setDither(true);
Paint3=new Paint();
Paint3.setStyle(Paint.Style.STROKE);
Paint3.setColor(Color.WHITE);
Paint3.setAntiAlias(true);
paintBorder = new Paint();
imagePaint= new Paint();
paintBorder.setColor(Color.WHITE);
paintBorder.setAntiAlias(true);
this.setLayerType(LAYER_TYPE_SOFTWARE, paintBorder);
this.bitmap2 = Bitmap.createScaledBitmap(bitmap, (bitmap.getWidth() - 40), (bitmap.getHeight() - 40), true);
imagePaint.setAntiAlias(true);
invalidate();
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
Shader b;
if (bitmap3 != null)
b = new BitmapShader(bitmap3, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
else
b = new BitmapShader(bitmap2, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
imagePaint.setShader(b);
canvas.drawBitmap(maskedBitmap(), 20, 20, null);
}
private Bitmap maskedBitmap()
{
Bitmap l1 = Bitmap.createBitmap(width,width, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(l1);
paintBorder.setShadowLayer(radius, x, y, Color.parseColor("#454645"));
Paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
final RectF rect = new RectF();
rect.set(20, 20, bitmap2.getWidth(), bitmap2.getHeight());
canvas.drawRoundRect(rect, corner_radius, corner_radius, paintBorder);
canvas.drawRoundRect(rect, corner_radius, corner_radius, imagePaint);
if (strokeWidth!=0.0f)
{
Paint3.setStrokeWidth(strokeWidth);
canvas.drawRoundRect(rect, corner_radius, corner_radius, Paint3);
}
Paint.setXfermode(null);
return l1;
}
// use seekbar here, here you have to pass "0 -- 250" here corner radius will change
public void setCornerRadius(int corner_radius)
{
this.corner_radius = corner_radius;
invalidate();
}
-------->use seekbar here, here you have to pass "0 -- 10.0f" here shadow radius will change
public void setShadow(float radius)
{
this.radius = radius;
invalidate();
}
// use seekbar here, here you have to pass "0 -- 10.0f" here stroke size will change
public void setStroke(float stroke)
{
this.strokeWidth = stroke;
invalidate();
}
private Bitmap updateSat(Bitmap src, float settingSat)
{
int w = src.getWidth();
int h = src.getHeight();
Bitmap bitmapResult =
Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas canvasResult = new Canvas(bitmapResult);
Paint paint = new Paint();
ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.setSaturation(settingSat);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(colorMatrix);
Paint.setColorFilter(filter);
canvasResult.drawBitmap(src, 0, 0, Paint);
return bitmapResult;
}
// use seekbar here, here you have to pass "0 -- 2.0f" here saturation will change
public void setSaturation(float sat)
{
System.out.println("qqqqqqqqqq "+sat);
bitmap3=updateSat(bitmap2, sat);
invalidate();
}
}
// Seekbar to change radius
radius_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
text_radius.setText(""+progress);
circularImageView.setCornerRadius(progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
// Seekbar to change shadow
shadow_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
float f= 4+progress/10.0f;
text_shadow.setText(""+progress);
circularImageView.setShadow(f);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
// Seekbar to change saturation
saturation_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
int progressSat = saturation_seekbar.getProgress();
float sat = (float) ((progressSat*4 / 100.0f)-1.0f);
circularImageView.setSaturation(sat);
text_saturation.setText(""+progressSat);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
// Seekbar to change stroke
stroke_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
if (progress==0)
{
float f=(progress*10.0f/100.0f);
circularImageView.setStroke(f);
}
else
{
float f=(progress*10.0f/100.0f);
circularImageView.setStroke(f);
}
text_stroke.setText(""+progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
//radius seekbar in xml file
<SeekBar
Android:layout_width="match_parent"
Android:layout_gravity="center"
Android:progress="50"
Android:max="250"
Android:id="@+id/radius_seekbar"
Android:layout_height="wrap_content" />
//saturation seekbar in xml file
<SeekBar
Android:layout_width="match_parent"
Android:layout_gravity="center"
Android:progress="50"
Android:max="100"
Android:id="@+id/saturation_seekbar"
Android:layout_height="wrap_content" />
//shadow seekbar in xml file
<SeekBar
Android:layout_width="match_parent"
Android:layout_gravity="center"
Android:progress="0"
Android:max="100"
Android:id="@+id/shadow_seekbar"
Android:layout_height="wrap_content" />
//stroke seekbar in xml file
<SeekBar
Android:layout_width="match_parent"
Android:layout_gravity="center"
Android:progress="0"
Android:max="100"
Android:id="@+id/stroke _seekbar"
Android:layout_height="wrap_content" />
単にonDraw()
メソッドが続くCustomImageviewを作成します。
@Override
protected void onDraw(Canvas canvas) {
float radius = this.getHeight()/2;
Path path = new Path();
RectF rect = new RectF(0, 0, this.getWidth(), this.getHeight());
path.addRoundRect(rect, radius, radius, Path.Direction.CW);
canvas.clipPath(path);
super.onDraw(canvas);
}