`
带个回家
  • 浏览: 138819 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

动画旋转箭头,源码

阅读更多

 很久没更新文章了,到时候在经常浏览别人的技术文章。

现在分享一个简单实现箭头旋转指向动画。虽然在actionbar里面实现很简单,但自己还是用代码写了。供大家分享。

转发请著名: http://androidmaster.iteye.com/blog/2335021

 

DrawerArrowDrawable.java

 

package com.jinwowo.android.widget;

import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathMeasure;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.animation.DecelerateInterpolator;

import com.jinwowo.android.R;

public abstract class DrawerArrowDrawable extends Drawable {
	private static final float ARROW_HEAD_ANGLE = (float) Math.toRadians(45.0D); // 箭头的角度
	protected float mBarGap; // 菜单 按钮两条线之间的间隔
	protected float mBarSize; // 菜单 按钮线的长度
	protected float mBarThickness; // 菜单按钮 线的宽度
	protected float mMiddleArrowSize; // 箭头按钮 中间那条线的长度
	protected final Paint mPaint = new Paint();
	protected final Path mPath = new Path();
	protected float mProgress;
	protected float cmProgress;
	protected int mSize;
	protected float mVerticalMirror = 1f;
	protected float mTopBottomArrowSize;// 箭头 按钮的上下部分的长度
	protected Context context;

	public DrawerArrowDrawable(Context context) {
		this.context = context;
		this.mPaint.setAntiAlias(true);// 设置抗锯齿
		this.mPaint.setColor(context.getResources().getColor(R.color.white)); // 设置画笔的颜色为白色
		this.mSize = context.getResources().getDimensionPixelSize(R.dimen.ldrawer_drawableSize);
		this.mBarSize = context.getResources().getDimensionPixelSize(R.dimen.ldrawer_barSize);
		this.mTopBottomArrowSize = context.getResources().getDimensionPixelSize(R.dimen.ldrawer_topBottomBarArrowSize);
		this.mBarThickness = context.getResources().getDimensionPixelSize(R.dimen.ldrawer_thickness);
		this.mBarGap = context.getResources().getDimensionPixelSize(R.dimen.ldrawer_gapBetweenBars);
		this.mMiddleArrowSize = context.getResources().getDimensionPixelSize(R.dimen.ldrawer_middleBarArrowSize);
		this.mPaint.setStyle(Paint.Style.STROKE);
		// 设置两条线相交时候 相交部分的处理
		this.mPaint.setStrokeJoin(Paint.Join.ROUND);
		this.mPaint.setStrokeCap(Paint.Cap.SQUARE);
		// 设置画笔线的宽度
		this.mPaint.setStrokeWidth(this.mBarThickness);
	}

	// 此方法是用来进行动画转换的时候差值的 第三个参数是进度
	protected float lerp(float paramFloat1, float paramFloat2, float paramFloat3) {
		return paramFloat1 + paramFloat3 * (paramFloat2 - paramFloat1);
	}

	PathMeasure mpMeasure;

	public void draw(Canvas canvas) {
		Rect localRect = getBounds();
		float f1 = lerp(this.mBarSize, this.mTopBottomArrowSize, this.mProgress);
		float f2 = lerp(this.mBarSize, this.mMiddleArrowSize, this.mProgress);
		float f3 = lerp(0.0F, this.mBarThickness / 2.0F, this.mProgress);
		float f4 = lerp(0.0F, ARROW_HEAD_ANGLE, this.mProgress);
		float f5 = 0.0F;
		float f6 = 180.0F;
		float f7 = lerp(f5, f6, this.mProgress);
		float f8 = lerp(this.mBarGap + this.mBarThickness, 0.0F, this.mProgress);
		this.mPath.rewind();
		float f9 = -f2 / 2.0F;
		this.mPath.moveTo(f9 + f3, 0.0F);
		this.mPath.rLineTo(f2 - f3, 0.0F);
		float f10 = (float) Math.round(f1 * Math.cos(f4));
		float f11 = (float) Math.round(f1 * Math.sin(f4));
		this.mPath.moveTo(f9, f8);
		this.mPath.rLineTo(f10, f11);
		this.mPath.moveTo(f9, -f8);
		this.mPath.rLineTo(f10, -f11);
		this.mPath.moveTo(0.0F, 0.0F);

		this.mPath.close();
		canvas.save();
		if (!isLayoutRtl())
			canvas.rotate(180.0F, localRect.centerX(), localRect.centerY());
		canvas.rotate(f7 * mVerticalMirror, localRect.centerX(), localRect.centerY());
		canvas.translate(localRect.centerX(), localRect.centerY());
		canvas.drawPath(this.mPath, this.mPaint);
		canvas.restore();
	}

	// 开启路径动画
	public void startPathAnim() {
		if (mProgress == cmProgress) {
			return;
		}
		// 0 - getLength()
		ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 10);
		valueAnimator.setDuration(1000);
		// 减速插值器
		valueAnimator.setInterpolator(new DecelerateInterpolator());
		valueAnimator.addUpdateListener(new AnimatorUpdateListener() {

			@Override
			public void onAnimationUpdate(ValueAnimator animation) {
				float value = (Float) animation.getAnimatedValue();
				if (cmProgress == 1) {
					mProgress = value / 10f;
					invalidateSelf();
				} else { // 0
					mProgress = 1 - value / 10f;
					invalidateSelf();
				}
				Log.e("TAG", value + "");
				// 获取当前点坐标封装到mCurrentPosition
				// mpMeasure.getPosTan(value, mCurrentPosition, null);
				// postInvalidate();
				// invalidateSelf();
			}
		});
		valueAnimator.start();

	}

	public int getIntrinsicHeight() {
		return this.mSize;
	}

	public int getIntrinsicWidth() {
		return this.mSize;
	}

	public void setAlpha(int alpha) {
		this.mPaint.setAlpha(alpha);
	}

	@Override
	public int getOpacity() {
		return PixelFormat.TRANSLUCENT;
	}

	public abstract boolean isLayoutRtl();

	public void setColorFilter(ColorFilter colorFilter) {
		this.mPaint.setColorFilter(colorFilter);
	}

	public void setVerticalMirror(boolean mVerticalMirror) {
		this.mVerticalMirror = mVerticalMirror ? 1 : -1;
	}

	/**
	 * 实现旋转动画。
	 * 
	 * @param paramFloat
	 *            0 .1
	 */
	public void setProgress(float paramFloat) {
		// this.mProgress = paramFloat;
		this.cmProgress = paramFloat;
		// invalidateSelf();
		startPathAnim();
	}

	public void setColor(int resourceId) {
		this.mPaint.setColor(context.getResources().getColor(resourceId));
	}
}

 

调用方法:imgUserHead为ImageView

final DrawerArrowDrawable drawable = new DrawerArrowDrawable(this.getCurtentActivity()) {

					@Override
					public boolean isLayoutRtl() {
						return false;
					}
				};
				imgUserHead.setImageDrawable(drawable);
				imgUserHead.setOnClickListener(new OnClickListener() {
					boolean isclick = false;

					@Override
					public void onClick(View arg0) {
						isclick = !isclick;
						if (isclick) {
							drawable.setProgress(0f);
						} else {
							drawable.setProgress(1f);
						}
					}
				});

 效果图:

 

下次分享:

 

欢迎大家扫描二维码加我,下载App体验使用。声明:下载App除了产生流量外,不会产生任何付费和信息泄密。

  • 大小: 9.2 MB
  • 大小: 4.4 MB
  • 大小: 88.8 KB
分享到:
评论

相关推荐

    旋转动画效果制作的Loading素材.rar

    旋转动画效果制作的Loading素材,这个素材是箭头的旋转效果,不过本效果可完全用于片头加载时的Flash Loading模块中,矢量旋转箭头动画,如截图所示。

    旋转的箭头Flash动画,可用做Loading

    摘要:Flash源码,短片剪辑,旋转动画,Loading 旋转的箭头Flash动画,可用做Loading加载时候的一个小动画素材,由三个箭头围绕一个点旋转,形成一个圆圈,不停的旋转动画,分享给大家Flash源文件,超多Flash精品源码...

    有点像select下拉框的Button旋转按钮动画.rar

    有点像select下拉框的Button旋转按钮动画,响应鼠标生成动画效果,当鼠标悬停于按钮时,按钮的上下边线翻转。  按钮的颜色可以自定义,按钮中的箭头符号是调用字体生成,因此不要删除fonts文件夹下的文件。

    JS实现网页3D旋转轮播图的源代码

    基于多属性缓动动画框架、数组API(push,pop,unshift,shift)所做的旋转轮播图,界面看上去更有三维效果。(因为更改了透明度和层级)点击左右箭头,实现图片轮换。

    高仿墨迹天气引导界面.zip

    第一个界面中有四个动画效果,最上面的“极低耗电”标示,最下面的箭头标示,还有中间旋转的电池图标和电子表的闪动,第二个界面最上面的“极小安装”动画和最下面的箭头动画和第一个图中的一样,不做过多介绍第三个...

    100多个JQuery效果示例(实例)div+css+javascrpit

    5. jquery+div带动画按钮图片手动与自动切换的特效代码 6. jquery一页多用的飞飞图片幻灯插件演示 7. jquery仿flash产品图片多角度展示特效代码 8. jquery仿flash图片放大相册的插件代码(Zoomer Gallery)下载 9....

    JavaScript_JQuery_CSS_CSS_DIV漂亮的实例123个

    5. jquery+div带动画按钮图片手动与自动切换的特效代码 6. jquery一页多用的飞飞图片幻灯插件演示 7. jquery仿flash产品图片多角度展示特效代码 8. jquery仿flash图片放大相册的插件代码(Zoomer Gallery)下载 9....

    JavaScript_JQuery_CSS_DIV漂亮的实例

    5. jquery+div带动画按钮图片手动与自动切换的特效代码 6. jquery一页多用的飞飞图片幻灯插件演示 7. jquery仿flash产品图片多角度展示特效代码 8. jquery仿flash图片放大相册的插件代码(Zoomer Gallery)下载 9....

    JQuery&CSS;&CSS;+DIV实例大全.rar

    6.jQuery带Tips动画提示通用表单验证插件下载(jquery validate),动画效果漂亮 7.jQuery鼠标移到下载地址滑出气泡提示效果的插件 8.又一款jquery实现链接Tip演示下载 9.常用jQuery弹出式链接提示效果Tooltip...

    超强的Web在线矢量绘图器与监控系统源码——基于visual graph

    技术完善:多页面、多图层、表格图形混排、透明度、自由旋转、动画效果、自定义线型、网纹、箭头、自定义任意多个文字标注、自定义图元连接点、自定义光标、图形保护、控制点,支持图形的逻辑分组,允许图元嵌套构建...

    jquery 动态示例

    5. jquery+div带动画按钮图片手动与自动切换的特效代码 6. jquery一页多用的飞飞图片幻灯插件演示 7. jquery仿flash产品图片多角度展示特效代码 8. jquery仿flash图片放大相册的插件代码(Zoomer Gallery)下载 9....

    高仿墨迹天气引导界面

    第一个界面中有四个动画效果,最上面的“极低耗电”标示,最下面的箭头标示,还有中间旋转的电池图标和电子表的闪动,第二个界面最上面的“极小安装”动画和最下面的箭头动画和第一个图中的一样,不做过多介绍第三个...

    围成圆形的Flash 3维缩略图图片展示.rar

    围成圆形的Flash 3维缩略图图片展示,看到圆形左右两侧的小...那就是控制按钮,点击后可控制圆形旋转,鼠标悬停于缩略图图片时,可点击图片到达指定网址,每点击一下小箭头,所围绕成的圆形就会滚动一个图片的位置。

    C#程序开发范例宝典(第2版).part12

    实例116 使用ImageList组件制作动画图片 171 3.10 DirectoryEntry组件 172 实例117 使用DirectoryEntry组件建立虚拟目录 172 第4章 图形技术 174 4.1 绘制图形 175 实例118 绘制公章 175 实例119 在图片中...

    一款彩色条状的列表下拉刷新特效

    该源码实现彩色条状的列表下拉刷新效果。列表下拉刷新时,不再出现一般的小箭头以及旋转圆圈的效果,而是出现一排有动画效果的七彩颜色条,类似彩虹一样。是一个不错的学习例子,喜欢的朋友可以下载研究一下,。

    C程序范例宝典(基础代码详解)

    实例252 旋转的五角星 356 实例253 变化的同心圆 358 实例254 小球碰撞 359 8.5 图形综合实例 361 实例255 圆形精美图案 361 实例256 直线精美图案 362 实例257 心形图案 363 实例258 钻石图案 365 ...

    EMlog博客古典大气、响应式模板 v1.3

    7、在侧边栏“日历”的当天日期位置上添加了旋转动画,这样静中有动,趣味性增加了,代表时间不停的旋转流逝……。 8、在网页底部的“返回顶部”文字上添加了滚动动画,以前是直接跳转到顶部。 9、点“评论分割线”...

Global site tag (gtag.js) - Google Analytics