android+清除循环动画,android自定义View之(4)-一键清除动画
android自定义View之(四)------一键清除动画
1.前言:
自己也是参考别人的一些自定义view例子,学习了一些基本的自定义view的方法。今天,我参考了一些资料,再结合自已的一些理解,做了一个一键清除的动画。当年,我实现这个是用了几张图片,采用Frame anination的方式来实现,但是这个方法,不灵活,并且占资源,下面,我就采用自定义view的方法来实现这个功能。
2.效果图:
3.具体详细代码
3.1 \res\values\attrs_on_key_clear_circle_view.xml
3.2 OnKeyClearCircleView.java
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.SweepGradient;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import com.example.administrator.customview.R;
public class OnKeyClearCircleView extends View implements Runnable{
private static final String TAG = "OnKeyClearCircleView";
private Paint paint;
private Paint outCirclePaint;
private Paint textPaint;
private Paint outArcPaint;
private Paint radarPain;
private Paint pointPain;
private int radarRotateDegree;
private int innerCircleColor;
private int innerCircleRadius;
private int outCircleColor;
private float outArcwidth;
private SweepGradient outArcSweepGradient;
private SweepGradient radarSweepGradient;
private Bitmap pointDrawable;
private Matrix pointRotate=new Matrix();
private int progress;
private float textSize;
private int padding;
private float startAngle;
private float radarSweepAngle;
private float pointRotateDegree;
private boolean isSart;
public OnKeyClearCircleView(Context context) {
super(context);
init(null, 0);
}
public OnKeyClearCircleView(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs, 0);
}
public OnKeyClearCircleView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(attrs, defStyle);
}
private void init(AttributeSet attrs, int defStyle) {
final TypedArray a = getContext().obtainStyledAttributes(
attrs, R.styleable.OnKeyClearCircleView, defStyle, 0);
innerCircleColor = a.getColor(R.styleable.OnKeyClearCircleView_innerCircleColor, Color.BLUE);
outCircleColor = a.getColor(R.styleable.OnKeyClearCircleView_outCircleColor, Color.GRAY);
innerCircleRadius = a.getInt(R.styleable.OnKeyClearCircleView_innerCircleRadius, 10);
progress = a.getInt(R.styleable.OnKeyClearCircleView_progress,0);
textSize = a.getDimension(R.styleable.OnKeyClearCircleView_textSize, 20);
outArcwidth = a.getDimension(R.styleable.OnKeyClearCircleView_outArcwidth, 20);
a.recycle();
pointDrawable = BitmapFactory.decodeResource(getResources(),R.drawable.point);
isSart = false;
startAngle = 0;
radarRotateDegree = 0;
radarSweepAngle = 0;
pointRotateDegree = 0;
padding = 5;
paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(innerCircleColor);
outCirclePaint = new Paint();
outCirclePaint.setAntiAlias(true);
outCirclePaint.setColor(outCircleColor);
outCirclePaint.setStyle(Paint.Style.FILL);
textPaint = new Paint();
textPaint.setTextSize(textSize);
textPaint.setAntiAlias(true);
outArcPaint = new Paint();
outArcPaint.setAntiAlias(true);
outArcPaint.setStyle(Paint.Style.STROKE);
outArcPaint.setStrokeWidth(outArcwidth);
outArcPaint.setStrokeCap(Paint.Cap.ROUND);
radarPain = new Paint();
outArcPaint.setAntiAlias(true);
pointPain = new Paint();
pointPain.setAntiAlias(true);
Thread thread=new Thread(this);
thread.start();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
int d = (width >= height) ? height : width;
setMeasuredDimension(d,d);
}
@Override
protected void onDraw(Canvas canvas) {
int width = getMeasuredWidth();
int height = getMeasuredHeight();
int pointX = width/2;
int pointY = height/2;
RectF rectf = new RectF(outArcwidth/2,outArcwidth/2,width-outArcwidth/2,height-outArcwidth/2);
//outArcSweepGradient = new SweepGradient(0,0,getResources().getColor(R.color.start_color),getResources().getColor(R.color.end_color));
outArcSweepGradient = new SweepGradient(pointX,pointY,Color.WHITE,Color.WHITE);
outArcPaint.setShader(outArcSweepGradient);
canvas.drawArc(rectf,startAngle,180,false,outArcPaint);
canvas.drawCircle(pointX,pointY,pointX -outArcwidth-padding,outCirclePaint);
if(radarSweepAngle < 180){
radarSweepGradient = new SweepGradient(pointX,pointY,Color.WHITE,Color.RED);
}else{
radarSweepGradient = new SweepGradient(pointX,pointY,Color.WHITE,Color.GREEN);
}
radarPain.setShader(radarSweepGradient);
RectF rectfRadar = new RectF(outArcwidth+padding,outArcwidth+padding,width-outArcwidth-padding,height-outArcwidth-padding);
canvas.drawArc(rectfRadar,0,radarSweepAngle,true,radarPain);
canvas.save();
canvas.translate(pointX,pointY);
pointRotate.setRotate(pointRotateDegree);
canvas.drawBitmap(pointDrawable, pointRotate, pointPain);
canvas.restore();;
canvas.drawCircle(pointX,pointY,innerCircleRadius,paint);
float textWidth = textPaint.measureText(progress + "%");
if(progress < 50){
//textPaint.setColor(oxbf3800);
textPaint.setColor(Color.RED);
}else{
//textPaint.setColor(new Color(ox6ec705));
textPaint.setColor(Color.GREEN);
}
canvas.drawText(progress+"%",pointX - textWidth/2,pointY + textSize/2 ,textPaint);
}
@Override
public void run() {
while(true){
if(isSart){
this.startAngle += 20;
if(this.startAngle > 360){
this.startAngle = this.startAngle-360;
}
this.radarSweepAngle += 10;
if(this.radarSweepAngle > 360){
this.radarSweepAngle = this.radarSweepAngle-360;
}
this.pointRotateDegree += 10;
if(this.pointRotateDegree > 360){
this.pointRotateDegree = this.pointRotateDegree-360;
}
progress = (int)radarSweepAngle*100/360;
postInvalidate();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void startClear(){
this.isSart = true;
}
public void stopClear(){
this.isSart =false;
}
public int getProgress() {
return progress;
}
public void setProgress(int progress) {
this.progress = progress;
}
}
3.3 res\layout\activity_custom_view_activity4.xml
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.customview.customview04.CustomViewActivity4">
android:layout_width="200dp"
android:layout_height="200dp"
android:id="@+id/onKeyClearCircleView"
android:background="#fdda6f"
app:innerCircleColor="#ffffff"
app:innerCircleRadius="35"
app:textSize="20sp"
app:progress="82"
app:outCircleColor="#dbdad7"
app:outArcwidth="10dp"
/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="start"
android:id="@+id/start"
android:layout_below="@+id/onKeyClearCircleView"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="end"
android:id="@+id/end"
android:layout_below="@+id/start"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
3.4 CustomViewActivity4.java
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.example.administrator.customview.R;
public class CustomViewActivity4 extends Activity implements View.OnClickListener {
private OnKeyClearCircleView onKeyClearCircleView;
private Button start;
private Button end;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom_view_activity4);
init();
}
private void init() {
onKeyClearCircleView = (OnKeyClearCircleView) findViewById(R.id.onKeyClearCircleView);
start = (Button) findViewById(R.id.start);
start.setOnClickListener(this);
end = (Button) findViewById(R.id.end);
end.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if(view == start){
onKeyClearCircleView.startClear();
}else if(view == end){
onKeyClearCircleView.stopClear();
}
}
}
4.代码下载地址:
5.参考资料:
1.Android自定义View实现雷达扫描动画
http://blog.csdn.net/oxygen0106/article/details/40144781
2.利用Android自定义View实现转盘旋转的效果
http://blog.csdn.net/canchew/article/details/5633421
android+清除循环动画,android自定义View之(4)-一键清除动画相关推荐
- android自定义View之(四)------一键清除动画
1.前言: 自己也是参考别人的一些自定义view例子,学习了一些基本的自定义view的方法.今天,我参考了一些资料,再结合自已的一些理解,做了一个一键清除的动画.当年,我实现这个是用了几张图片,采用F ...
- Android 雪花飘落动画效果 自定义View
在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不 ...
- Android属性动画与自定义View——实现vivo x6更新系统的动画效果
晚上好,现在是凌晨两点半,然后我还在写代码.电脑里播放着<凌晨两点半>,晚上写代码,脑子更清醒,思路更清晰. 今天聊聊属性动画和自定义View搭配使用,前面都讲到自定义View和属性动画, ...
- Android 气泡动画(自定义View类)
Android 气泡动画(自定义View类) 一.前言 二.代码 1. 随机移动的气泡 2.热水气泡 一.前言 最近有需求制作一个水壶的气泡动画,首先在网上查找了一番,找到了一个文章. https:/ ...
- Android软件开发之盘点自定义View界面大合集(二)
Android软件开发之盘点自定义View界面大合集(二) - 雨松MOMO的程序世界 - 51CTO技术博客 雨松MOMO带大家盘点Android 中的自定义View界面的绘制 今天我用自己写的一个 ...
- Carson带你学Android:源码解析自定义View Draw过程
前言 自定义View是Android开发者必须了解的基础 网上有大量关于自定义View原理的文章,但存在一些问题:内容不全.思路不清晰.无源码分析.简单问题复杂化 等 今天,我将全面总结自定义View ...
- Android中实现Bitmap在自定义View中的放大与拖动
一基本实现思路: 基于View类实现自定义View –MyImageView类.在使用View的Activity类中完成OnTouchListener接口,实现对MotionEvent事件的监听与处理 ...
- android 仿360浮动,Android仿360悬浮小球自定义view实现示例
Android仿360悬浮小球自定义view实现示例 效果图如下: 实现当前这种类似的效果 和360小球 悬浮桌面差不错类似.这种效果是如何实现的呢.废话不多说 ,直接上代码. 1.新建工程,添加悬浮 ...
- Android仿IOS滑动关机-自定义view系列(6)
Android仿IOS滑动关机-自定义view系列 功能简介 GIf演示 主要实现步骤-具体内容看github项目里的代码 Android技术生活交流 更多其他页面-自定义View-实用功能合集:点击 ...
最新文章
- AngularJs异步文件上传
- .net得到ip(引)
- python操作php文件,python怎么操作文件
- 做演员是圆梦 做生意学会面对现实
- 真正的Go编译器与链接器在哪里?
- 数据科学 IPython 笔记本 8.3 Matplotlib 可视化
- Java学习笔记_180704_final和static关键字
- wxpython textctrl_wxpython中Textctrl回车事件无效的解决方法
- Oracle存储过程的异常处理
- 自定义action消息
- 社区发现(三)--CMP
- sel在c语言,iOS 你所不知道的SEL
- 一款集成微信小助手的mac微信最新版!支持发朋友圈!
- 数据分析--Python连接阿里云数据库
- 戴尔服务器加装固态硬盘吗,戴尔如何加装固态硬盘_戴尔电脑增加固态硬盘教程...
- UE4-音效触发技巧
- Prim算法求图的最小生成树(Java)
- 如何利用html制作电影影评网,HTML制作电影影评网 - 手册网
- shell脚本之双重循环
- 如何在 Google Chrome 浏览器中使用 Java?