圆形的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 ...
随机推荐
- Emgu.CV(一)
由于这块的知识不少,会分好几期写完 什么是OpenCV? OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.它轻量级而且高效--由一 ...
- Ubuntu使用Windows下的conio.h
把虚线框里面的内容粘贴进文档文本里面 --------------------------------------------------------------------------------- ...
- uva 10118,记忆化搜索
这个题debug了长达3个小时,acm我不能放弃,我又回来了的第一题! 一开始思路正确,写法不行,结果越改越乱 看了网上某神的代码,学习了一下 coding+debug:4小时左右,记忆化搜索+dp类 ...
- “华尔街之狼”:ICO是“史上最大骗局”
勘探船进村的那个夏季,父亲从城里带回了那把手电.手电的金属外壳镀了镍,看上去和摸起来一样冰凉.父亲进城以前采了两筐枸杞子,他用它们换回了那把锃亮的东西.父亲一个人哼着<十八摸>上路,鲜红透 ...
- LINUX 笔记-特定shell变量
$# 传递到脚本的参数个数 $* 以一个单字符串显示所有向脚本传递的参数.与位置变量不同,此选项参数可超过9个 $$ 脚本运行的当前进程ID号 $! 后台运行的最后一个进程的进程ID号 $@ 与$*相 ...
- MongoDB全文检索
1. 全文检索概念: 全文检索是对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式. (暂时不支持中文) ...
- 基于场景解析RecyclerView的回收复用机制原理
最近在研究 RecyclerView 的回收复用机制,顺便记录一下.我们知道,RecyclerView 在 layout 子 View 时,都通过回收复用机制来管理.网上关于回收复用机制的分析讲解的文 ...
- DB---数据库中Schema的理解
今天看到了Schema一词,对于它的理解网上也是说法很多,有一种受到认可的程度比较大,暂且先使用一下: " 首先我来做一个比喻,什么是Database,什么是Schema,什么是Table, ...
- Fibonacci Check-up
Fibonacci Check-up Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 【Spring】渲染Web视图
前言 前面学习了编写Web请求的控制器,创建简单的视图,本篇博文讲解控制器完成请求到结果渲染到用户的浏览器的过程. 渲染Web视图 理解视图解析 前面所编写的控制器方法都没有直接产生浏览器中渲染所需要 ...