Android 自定义Drawable 实现圆角圆形图片
2016-10-29 22:34
351 查看
概述
在之前的博客Android Drawable(一)之ShapeDrawable 和 Android Drawable(二)中主要讲解了Android中常见的Drawable的使用方法,今天在这里主要讲解一下如何通过自定义Drawable实现圆角和圆形图片。在Android开发中,我们经常通过使用自定义控件来完成一些UI效果而很少使用自定义Drawable,主要原因是自定义Drawable无法在xml文件中使用。Drawable一般都是作为View的背景显示出来,在View显示Drawable时,主要就是通过调用Drawable类的draw(canvas)方法实现。
自定义Drawable
自定义圆形图片
package com.zhangke.drawabledemo2; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Shader; import android.graphics.drawable.Drawable; /** * Created by zhangke on 2016/10/29. */ public class CircleDrawable extends Drawable { /** * 显示图片 */ private Bitmap mBitmap; /** * BitmapShader */ private BitmapShader mBitmapShader; /** * 画笔 */ private Paint mPaint; /** * 圆心 */ private float cx, cy; /** * 半径 */ private float radius; private int size; public CircleDrawable(Bitmap bitmap) { this.mBitmap = bitmap; mBitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setShader(mBitmapShader); size = Math.min(bitmap.getWidth(), bitmap.getHeight()); cx = size / 2; cy = size / 2; radius = size / 2; } @Override public void draw(Canvas canvas) { canvas.drawCircle(cx, cy, radius, mPaint); } @Override public int getIntrinsicHeight() { return size; } @Override public int getIntrinsicWidth() { return size; } @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); } @Override public void setColorFilter(ColorFilter colorFilter) { mPaint.setColorFilter(colorFilter); } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } }
自定义圆角图片
package com.zhangke.drawabledemo2; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Shader; import android.graphics.drawable.Drawable; /** * Created by zhangke on 2016/10/29. */ public class RoundDrawable extends Drawable { /** * 显示图片 */ private Bitmap mBitmap; /** * BitmapShader */ private BitmapShader mBitmapShader; /** * 画笔 */ private Paint mPaint; private RectF rectF; public RoundDrawable(Bitmap bitmap) { this.mBitmap = bitmap; mBitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setShader(mBitmapShader); } @Override public void setBounds(int left, int top, int right, int bottom) { super.setBounds(left, top, right, bottom); rectF = new RectF(left, top, right, bottom); } @Override public void draw(Canvas canvas) { canvas.drawRoundRect(rectF, 100, 100 ,mPaint); } @Override public int getIntrinsicHeight() { return mBitmap.getHeight(); } @Override public int getIntrinsicWidth() { return mBitmap.getWidth(); } @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); } @Override public void setColorFilter(ColorFilter colorFilter) { mPaint.setColorFilter(colorFilter); } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } }
在自定义Drawable时,默认需要复写draw、setAlpha、setColorFilter、getOpacity四个方法,其中最核心的方法就是draw方法了。
在通常情况下,还需要实现getIntrinsicHeight和getIntrinsicWidth方法,这两个方法返回的是drawable的大小,如果我们不重写这两个方法,drawable是不会被绘制出来,因为这两个方法默认的返回值是-1。
使用自定义drawable
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.zhangke.drawabledemo2.MainActivity"> <ImageView android:id="@+id/imageview1" android:background="#dca098" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:id="@+id/imageview2" android:layout_width="wrap_content" android:background="#98d1dc" android:layout_height="wrap_content" /> <ImageView android:id="@+id/imageview3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#e7b3d8"/> </LinearLayout>
ImageView imageView1 = (ImageView) findViewById(R.id.imageview1); Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.d1); ImageView imageView2 = (ImageView) findViewById(R.id.imageview2); Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.d2); ImageView imageView3 = (ImageView) findViewById(R.id.imageview3); Bitmap bitmap3 = BitmapFactory.decodeResource(getResources(), R.drawable.d3); imageView1.setImageDrawable(new CircleDrawable(bitmap1)); imageView2.setImageDrawable(new CircleDrawable(bitmap2)); imageView3.setImageDrawable(new CircleDrawable(bitmap3)); // imageView1.setImageDrawable(new RoundDrawable(bitmap1)); // imageView2.setImageDrawable(new RoundDrawable(bitmap2)); // imageView3.setImageDrawable(new RoundDrawable(bitmap3));
圆形图片效果图:
圆角图片效果图:
相关文章推荐
- Android 自定义Drawable 实现圆角矩形和圆形图片
- 自定义Drawable 实现图片圆角、圆形、椭圆形
- Android自定义ImageView实现图片缩放滑动,双击放大缩小,多点触控旋转,圆角矩形,圆形和仿刮刮卡效果
- Android自定义Drawable实现圆形和圆角
- Android 自定义View修炼-Android实现圆形、圆角和椭圆自定义图片View(使用BitmapShader图形渲染方法)
- Android使用BitmapShader图形渲染实现圆形、圆角和椭圆自定义图片View
- Android自定义view实现圆形、圆角和椭圆图片(BitmapShader图形渲染)
- [AndroidUI]自定义view(四):实现圆形圆角图片
- Android自定义ImageView实现图片圆形 ,椭圆和矩形圆角显示
- Android自定义ImageView实现图片圆形 ,椭圆和矩形圆角显示
- Android 使用自定义Drawable 设置圆角矩形或者圆形图片
- Android Drawable 自定义(圆角图片和圆形图片)
- 自定义Drawable实现圆角图片和圆形图片
- 自定义Drawable 实现圆形图片 和带圆角的图片
- Android 自定义 RoundImageView 实现圆角矩形或圆形图片
- Android自定义ImageView实现图片圆形 ,椭圆和矩形圆角显示
- android drawable打造圆形,圆角图片
- Android_BitmapShader实现圆形、圆角图片
- Android Xfermode 实战 实现圆形、圆角图片
- Android BitmapShader实现圆形和圆角图片