Android 自定义Drawable 实现圆角圆形图片
来源:互联网 发布:宝塔性能优化 编辑:程序博客网 时间:2024/05/14 08:32
概述
在之前的博客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));
圆形图片效果图:
圆角图片效果图:
0 0
- Android 自定义Drawable 实现圆角圆形图片
- Android 自定义Drawable 实现圆角矩形和圆形图片
- 自定义Drawable实现圆角图片和圆形图片
- Android Drawable 自定义(圆角图片和圆形图片)
- 自定义Drawable 实现图片圆角、圆形、椭圆形
- 自定义Drawable实现圆形图片
- Android Drawable 实现圆形,方形圆角图片
- android drawable打造圆形,圆角图片
- 自定义Drawable实现圆形和圆角Drawable
- android自定义圆形drawable
- Android 自定义 RoundImageView 实现圆角矩形或圆形图片
- android 自定义圆形图片实现
- 自定义drawable实现圆角图片
- 自定义Drawable实现圆形图像
- Android自定义圆形和圆角图片
- Android自定义圆形圆角图片示例
- Android 使用Drawable实现圆角与圆形图案
- 自定义圆角或圆形drawable
- 区分BITMAP、CBitmap和HBITMAP
- C语言函数指针的几种用法
- android自定义view的两种方法(一)
- vim编辑器的简单操作
- ubuntu的文字解决方案
- Android 自定义Drawable 实现圆角圆形图片
- 装机那些事
- 一些网络开发函数
- 形态学处理:膨胀、腐蚀、开运算、闭运算、形态学梯度、顶帽、黑帽
- 网易云音乐一件换曲插件
- android拒绝token过期的一种方法
- opencv读取海康威视摄像头
- Java经典算法(三)
- hdu 5933 ArcSoft's Office Rearrangement