上篇我们已经说过了一种最简单实现圆角图片的方法,今天我们来看第二种方法,这种方法和第一种是一样的,只不过上次用的是系统实现的,今天我们自己来一步步干出来。。
好,先看看我的女神,很漂亮的哦
圆角和圆形图都出来了,下面看看实现代码,准保你看一次就会了
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">
<ImageView
android:id="@+id/mm1"
android:layout_width="200dp"
android:layout_height="200dp" />
<ImageView
android:id="@+id/mm2"
android:layout_width="200dp"
android:layout_height="200dp" />
<ImageView
android:id="@+id/mm3"
android:layout_width="200dp"
android:layout_height="200dp" />
</LinearLayout>
布局文件没说的,看布局我们并没有自定义view,那到底改了啥呢,往下看
public class RoundImageDrawable extends Drawable {
private Paint paint;
private RectF rectF;
private Bitmap mBitmap;
private float radius;
private boolean isRound;
public RoundImageDrawable(Bitmap bitmap) {
this.mBitmap = bitmap;
BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setShader(bitmapShader);
}
@Override
public void setBounds(int left, int top, int right, int bottom) {
super.setBounds(left, top, right, bottom);
if (isRound) {
rectF = new RectF(left, top, Math.min(right, bottom), Math.min(right, bottom));
} else {
rectF = new RectF(left, top, right, bottom);
}
}
public void setisRound(boolean round) {
if (isRound = round) {
radius = Math.min(getIntrinsicHeight(), getIntrinsicWidth()) / 2;
}
}
public void setRadius(int radius) {
this.radius = radius;
}
@Override
public void draw(@NonNull Canvas canvas) {
canvas.drawRoundRect(rectF, radius, radius, paint);
}
@Override
public void setAlpha(@IntRange(from = 0, to = 255) int alpha) {
paint.setAlpha(alpha);
}
@Override
public int getIntrinsicWidth() {
return mBitmap.getWidth();
}
@Override
public int getIntrinsicHeight() {
return mBitmap.getHeight();
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
paint.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
}
这就是最核心的一个类了,Drawable自定义Drawable,很多人估计没这么玩过,其实要是看过ImageView源码的人就知道,在ondraw里面就是操作的Drawable,各种玩Drawable,如果你看过第一种圆角实现的方法源码,也会发现里面基本是一样的,只是人家细节处理很多,封装了很多,原理一样的
ImageView image1 = (ImageView) findViewById(R.id.mm1);
ImageView image2 = (ImageView) findViewById(R.id.mm2);
ImageView image3 = (ImageView) findViewById(R.id.mm3);
RoundImageDrawable mRoundImageDrawable = new RoundImageDrawable(BitmapFactory.decodeResource(getResources(), R.drawable.ns1));
RoundImageDrawable mRoundImageDrawable2 = new RoundImageDrawable(BitmapFactory.decodeResource(getResources(), R.drawable.ns1));
RoundImageDrawable mRoundImageDrawable3 = new RoundImageDrawable(BitmapFactory.decodeResource(getResources(), R.drawable.ns1));
mRoundImageDrawable.setisRound(true);
image1.setImageDrawable(mRoundImageDrawable);
mRoundImageDrawable2.setRadius(100);
image2.setImageDrawable(mRoundImageDrawable2);
mRoundImageDrawable3.setRadius(200);
image3.setImageDrawable(mRoundImageDrawable3);
activity里面使用也是最简单的了,几行代码就ok。
好了,代码也看了,女神也被看了,是时候说再见了,后面会介绍第三种圆角实现方法,记得来看哦。。。我等你