圆形的ImageView
转载自gitHub的ImageView,因为本身就是可用的,也没什么好说的,拷贝回去用就是了,可以设置除了背景,还可以设置边框什么的,比起CardView设置圆角,功能更加强大。
import android.animation.ArgbEvaluator; import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Build; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.animation.LinearInterpolator; public class AnimateCheckBox extends View { ; private static final int DEFAULT_LINE_COLOR = Color.WHITE; private static final int DEFAULT_CHECKED_COLOR = Color.RED; private static final int DEFAULT_UNCHECK_COLOR = Color.GRAY; ; ; private Paint mCirclePaint; private Paint mLinePaint; private int radius; //圆的半径 private int width, height; //控件宽高 private int cx, cy; //圆心xy坐标 ]; //对号的3个点的坐标 private float correctProgress; private float downY; private boolean isChecked; private boolean toggle; private boolean isAnim; private int animDuration = DEFAULT_ANIM_DURATION; private int unCheckColor = DEFAULT_UNCHECK_COLOR; private int circleColor = DEFAULT_CHECKED_COLOR; private int correctColor = DEFAULT_LINE_COLOR; private int correctWidth = DEFAULT_LINE_WIDTH; private OnCheckedChangeListener listener; public AnimateCheckBox(Context context) { this(context, null); } public AnimateCheckBox(Context context, AttributeSet attrs) { ); } public AnimateCheckBox(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.); circleColor = a.getColor(R.styleable.AnimateCheckBox_checkedColor, DEFAULT_CHECKED_COLOR); unCheckColor = a.getColor(R.styleable.AnimateCheckBox_unCheckColor, DEFAULT_UNCHECK_COLOR); correctColor = a.getColor(R.styleable.AnimateCheckBox_lineColor, DEFAULT_LINE_COLOR); correctWidth = a.getDimensionPixelSize(R.styleable.AnimateCheckBox_lineWidth, DEFAULT_LINE_WIDTH); animDuration = a.getInteger(R.styleable.AnimateCheckBox_animDuration, DEFAULT_ANIM_DURATION); a.recycle(); init(context); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public AnimateCheckBox(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } /** * 初始化 * * @param context */ private void init(Context context) { mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG); mCirclePaint.setStyle(Paint.Style.FILL); mCirclePaint.setColor(circleColor); mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG); mLinePaint.setStyle(Paint.Style.FILL); mLinePaint.setColor(correctColor); mLinePaint.setStrokeWidth(correctWidth); setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (isChecked) { hideCorrect(); } else { showCheck(); } } }); } /** * 返回当前选中状态 * * @return */ public boolean isChecked() { return isChecked; } /** * 设置当前选中状态 * * @param checked */ public void setChecked(boolean checked) { if (isChecked && !checked) { hideCorrect(); } else if (!isChecked && checked) { showCheck(); } } public void setUncheckStatus() { isChecked = false; radius = DEFAULT_RADIUS; ; invalidate(); } /** * 确定尺寸坐标 * * @param w * @param h * @param oldw * @param oldh */ @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); height = width = Math.min(w - getPaddingLeft() - getPaddingRight(), h - getPaddingBottom() - getPaddingTop()); ; ; float r = height / 2f; ] = r / 2f + getPaddingLeft(); ] = r + getPaddingTop(); ] = r * 5f / 6f + getPaddingLeft(); ] = r + r / 3f + getPaddingTop(); ] = r * 1.5f + getPaddingLeft(); ] = r - r / 3f + getPaddingTop(); DEFAULT_RADIUS = radius = (int) (height * 0.125f); } @Override protected void onDraw(Canvas canvas) { float f = (radius - height * 0.125f) / (height * 0.5f); //当前进度 mCirclePaint.setColor(evaluate(f, unCheckColor, circleColor)); canvas.drawCircle(cx, cy, radius, mCirclePaint); //画圆 //画对号 ) { if (correctProgress < 1 / 3f) { ] + (] - ]) * correctProgress; ] + (] - ]) * correctProgress; canvas.drawLine(], ], x, y, mLinePaint); } else { ] + (] - ]) * correctProgress; ] + (] - ]) * correctProgress; canvas.drawLine(], ], ], ], mLinePaint); canvas.drawLine(], ], x, y, mLinePaint); } } } /** * 设置圆的颜色 * * @param color */ public void setCircleColor(int color) { circleColor = color; } /** * 设置对号的颜色 * * @param color */ public void setLineColor(int color) { mLinePaint.setColor(color); } /** * 设置未选中时的颜色 * * @param color */ public void setUnCheckColor(int color) { unCheckColor = color; } private int evaluate(float fraction, int startValue, int endValue) { ) { return startValue; } ) { return endValue; } int startInt = startValue; ) & 0xff; ) & 0xff; ) & 0xff; int startB = startInt & 0xff; int endInt = endValue; ) & 0xff; ) & 0xff; ) & 0xff; int endB = endInt & 0xff; ) | ((startR + () | ((startG + () | ((startB + (int) (fraction * (endB - startB)))); } /** * 处理触摸事件触发动画 */ private class OnChangeStatusListener implements OnTouchListener { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downY = event.getRawY(); break; case MotionEvent.ACTION_MOVE: float dy = event.getRawY() - downY; ) { //滑过一半触发 toggle = true; } else { toggle = false; } break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: if (toggle) { if (isChecked) { hideCorrect(); } else { showCheck(); } } break; } return true; } } @TargetApi(Build.VERSION_CODES.HONEYCOMB) private void showUnChecked() { if (isAnim) { return; } isAnim = true; ValueAnimator va = ValueAnimator.ofFloat(, ).setDuration(animDuration); va.setInterpolator(new LinearInterpolator()); va.start(); va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float value = (float) animation.getAnimatedValue(); // 0f ~ 1f radius = (int) ((1 - value) * height * 0.375f + height * 0.125f); ) { isChecked = false; isAnim = false; if (listener != null) { listener.onCheckedChanged(AnimateCheckBox.this, false); } } invalidate(); } }); } @TargetApi(Build.VERSION_CODES.HONEYCOMB) private void showCheck() { if (isAnim) { return; } isAnim = true; ValueAnimator va = ValueAnimator.ofFloat(, ).setDuration(animDuration); va.setInterpolator(new LinearInterpolator()); va.start(); va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float value = (float) animation.getAnimatedValue(); // 0f ~ 1f radius = (int) (value * height * 0.37f + height * 0.125f); ) { isChecked = true; isAnim = false; if (listener != null) { listener.onCheckedChanged(AnimateCheckBox.this, true); } showCorrect(); } invalidate(); } }); } @TargetApi(Build.VERSION_CODES.HONEYCOMB) private void showCorrect() { if (isAnim) { return; } isAnim = true; ValueAnimator va = ValueAnimator.ofFloat(, ).setDuration(animDuration); va.setInterpolator(new LinearInterpolator()); va.start(); va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float value = (float) animation.getAnimatedValue(); // 0f ~ 1f correctProgress = value; invalidate(); ) { isAnim = false; } } }); } @TargetApi(Build.VERSION_CODES.HONEYCOMB) private void hideCorrect() { if (isAnim) { return; } isAnim = true; ValueAnimator va = ValueAnimator.ofFloat(, ).setDuration(animDuration); va.setInterpolator(new LinearInterpolator()); va.start(); va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float value = (float) animation.getAnimatedValue(); // 0f ~ 1f correctProgress = 1 - value; invalidate(); ) { isAnim = false; showUnChecked(); } } }); } public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { this.listener = listener; } public interface OnCheckedChangeListener { void onCheckedChanged(View buttonView, boolean isChecked); } }style参数设置<declare-styleable name="CircleImageView"> <attr name="civ_border_width" format="dimension" /> <attr name="civ_border_color" format="color" /> <attr name="civ_border_overlay" format="boolean" /> <attr name="civ_fill_color" format="color" /> </declare-styleable>XML布局文件添加代码xmlns:app="http://schemas.android.com/apk/res-auto"
圆形的ImageView的更多相关文章
- Android开发之自定义圆形的ImageView的实现
android中的ImageView只能显示矩形的图片,这样一来不能满足我们其他的需求,比如要显示圆形的图片,这个时候,我们就需要自定义ImageView了,其原理就是首先获取到图片的Bitmap,然 ...
- 自定义控件之 圆形 / 圆角 ImageView
一.问题在哪里? 问题来源于app开发中一个很常见的场景——用户头像要展示成圆的: 二.怎么搞? 机智的我,第一想法就是,切一张中间圆形透明.四周与底色相同.尺寸与头像相同的蒙板图片,盖在 ...
- Android圆形图片--ImageView
[ RoundImageView.java ] package com.dxd.roundimageview; import android.content.Context; import andro ...
- 圆形图片 ImageView
package com.example.m_evolution; import android.content.Context; import android.graphics.Bitmap; imp ...
- Android学习笔记-绘制圆形ImageView实例
现在很多的APP都很喜欢圆形的头像,这里就简单的写个圆形的ImageView~ 第三方圆形ImageView控件: RoundedImageView CircleImageView 实现代码: 自定义 ...
- Android之圆形头像裁切
PS:今天项目测试组发现,百度地图定位的数据坐标位置是正确的,但是显示的数据是错误的.最后查来查去发现,那个商厦在百度地图上根本就没有那条数据,这让我如何显示,当初就推崇使用高德地图定位,上面的数据量 ...
- 圆形的Volley.NetworkImageView控件的实现
github上有个开源项目CircleImageView,可以简单的实现一个圆形的ImageView,就像qq头像那样. NetworkImageView是volley中的一个组件,可以方便的加载网络 ...
- xml 实现圆形图 和 椭圆形图
1. 效果图 2.圆形图 <ImageView android:layout_width="wrap_content" android:layout_height=" ...
- Android开发之自定义圆角矩形图片ImageView的实现
android中的ImageView只能显示矩形的图片,这样一来不能满足我们其他的需求,比如要显示圆角矩形的图片,这个时候,我们就需要自定义ImageView了,其原理就是首先获取到图片的Bitmap ...
随机推荐
- win10 uwp 隐私声明
本文讲的是如何去写隐私声明. 垃圾微软要求几乎每个应用都要有隐私声明,当然如果你不拿用户信息的话,那么用户声明是一个URL,我们应该把应用声明放在哪? 其实我们简单方法是把隐私声明Privacy Po ...
- Caused by: java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required
概述 看到异常 一般就知道 在使用JdbcTemplate 需要购入数据源, 购入数据源的方式有两种,一种是xml 配置 在DAO层注入数据源, 另一种是在xml 中 配置模版JdbcTemplate ...
- EJBCA安装教程+postgresql+wildfly10
1. 安装环境说明 笔者在本机的虚拟机下进行的安装,数据库已经装好了的. ubuntu16.04 x64 postgresql:9 wildfly10 2. 安装前准备 下载必要软件包(直接到官网下载 ...
- Element ui表格展示图片问题
当需要遍历图片时,不能直接使用prop绑定值,具体 代码如下 <el-table-column label="头像" width="100"> &l ...
- angular指令之complie和link不得不说的故事
angular指令比较晦涩难懂的就是complie和link字段了,什么时候该用complie?什么时候该用link?总是很难分别清楚.当理解了指令的真正编译原理的时候,就会发现这相当的简单. ng怎 ...
- linux学习(十)find命令、Linux文件后缀名、Linux和windows文件互传
一.和find相关的几个搜索命令,了解即可. 1.1 which [root@iZ25lzba47vZ ~]# which ls alias ls='ls --color=auto' /usr/bin ...
- hbase的HQuorumPeer和QuorumPeerMain
hbase是列式数据库,既可以单机也可以以集群的方式搭建,以集群的方式搭建一般建立在hdfs之上. 分布式的hbase如何启动? 首先启动hadoop,然后就来问题了:zookeeper和hbase的 ...
- MySQL-client-5.6.36-1.linux_glibc2.5.x86_64.rpm安装详解
centos6.8已经安装了mysql,所以要卸载掉 查看命令 rpm -qa | grep mysql 注意:MySQL区分大小写 grep mysql 和grep MySQL 是不一样的!! 卸载 ...
- AngularJS学习篇(二十二)
AngularJS 依赖注入 什么是依赖注入 wiki 上的解释是:依赖注入(Dependency Injection,简称DI)是一种软件设计模式,在这种模式下,一个或更多的依赖(或服务)被注入(或 ...
- ③bootstrap文本使用基础案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...