`
带个回家
  • 浏览: 140005 次
  • 性别: 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
分享到:
评论

相关推荐

    箭头动画效果的Flash loading源码.rar

    在这个箭头动画中,可能使用了时间轴控制或者基于代码的Tween类来实现箭头的移动或旋转,以模拟加载过程。当加载完成时,箭头消失,这可能通过监听Loader类的“complete”事件来实现,然后隐藏或删除箭头对象,启动...

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

    本话题主要关注的是如何制作一个旋转动画效果,具体为一个矢量旋转箭头的Loading素材,适用于Flash加载模块。以下是关于这个主题的详细知识点: 1. **Flash动画基础**:Flash是一款广泛应用于创建互动内容、动画和...

    jQuery实现带箭头左右自动切换3D旋转木马特效源码.zip

    本项目“jQuery实现带箭头左右自动切换3D旋转木马特效源码”是基于jQuery创建的一个动态展示效果,常用于网站产品展示或图片轮播。下面我们将深入探讨这个项目的相关知识点。 首先,3D旋转木马特效是一种视觉效果,...

    14种CSS焦点图箭头导航动画效果Demo

    这14种不同的动画效果可能涵盖了各种风格和技术,如渐变变换、旋转、缩放、平移、透明度变化等。每一种效果都是通过精心设计的CSS3属性实现的,例如`transform`用于进行2D或3D变换,`transition`定义了元素从一种...

    Android应用源码之乐动力的酷黑旋转引导动画.zip

    本压缩包“Android应用源码之乐动力的酷黑旋转引导动画.zip”提供了乐动力应用中的一个酷炫黑色主题的旋转引导动画源码,我们可以从中学到如何在Android中实现类似的动态效果。 首先,这个引导动画可能基于自定义...

    IOS应用源码——圆形箭头的加载组件.zip

    源码中可能会包含一个自定义的UIView子类,该子类扩展了标准视图的功能,实现了旋转箭头的动画效果。 在实现这个圆形箭头的加载效果时,开发人员可能会利用Core Animation框架,这是一个强大的工具,可以创建复杂的...

    Html5+CSS3+js动画小游戏源码,HTML5游戏开发

    2. **CSS3 动画和转换**:如何通过CSS3实现元素的平滑移动、旋转、缩放等动画效果,增强游戏视觉体验。 3. **JavaScript基础**:事件处理、变量、数据类型、函数、循环、条件语句等基本概念。 4. **JavaScript高级...

    IOS应用源码之圆形箭头的加载组件.zip

    圆形箭头的旋转动画很可能就是通过Core Animation的CALayer进行实现的,利用CAKeyframeAnimation或者CABasicAnimation来控制箭头的旋转路径和速度。 3. **Auto Layout**:为了适配不同屏幕尺寸的iOS设备,开发者...

    html5实现简单的俄罗斯方块动画效果游戏源码.zip

    在这个"html5实现简单的俄罗斯方块动画效果游戏源码.zip"压缩包中,我们可以深入学习如何利用HTML5的一些关键特性来构建一个基本的俄罗斯方块游戏。 首先,HTML5的`<canvas>`元素是这个游戏的核心部分。`<canvas>`...

    js特效脚本含源码和说明箭头动画风车式过渡的满屏焦点图

    风车式过渡动画,是一种以风车转动为灵感的视觉效果,通过在元素切换时采用旋转和缩放等视觉效果来实现平滑过渡。这种动画特别适合用于焦点图切换的场景,因为它既能吸引用户的注意力,又能流畅地引导用户从一张图片...

    基于flash(as3)做的鼠标跟随旋转示例【附源码】

    1. **ActionScript 3 (AS3)**: AS3是Adobe Flash平台的主要编程语言,用于创建交互式内容、动画和应用程序。相较于AS2,AS3引入了更严格的类型检查、类和包的概念,性能提升,并且语法更接近于Java和C#。 2. **事件...

    圆形箭头的加载组件.zipIOS应用例子源码下载

    2. 动画效果:为了实现箭头的旋转效果,开发者可能会利用`CADisplayLink`或`NSTimer`来定期更新视图的旋转角度。另一种方法是使用`CAAnimation`,特别是`CABasicAnimation`,它可以轻松地添加平滑的旋转动画到视图上...

    jQuery仿3D效果三联切换旋转木马插件源码.zip

    《jQuery仿3D效果三联切换旋转木马插件源码解析》 在现代网页设计中,为了提升用户体验,各种动态效果和交互设计被广泛应用。其中,旋转木马(Carousel)插件是一种常见且吸引人的元素,它允许用户在有限的空间内...

    Android应用源码之listview 的各种动画效果_应用.zip

    - **下拉刷新与上拉加载更多动画**:常见的下拉刷新动画如旋转箭头,上拉加载更多则可能有加载条上下滑动等效果。 4. **内置动画库**:Android SDK提供了Animation和Animator两个库,可以创建基本的补间动画和属性...

    ios应用源码之圆形箭头的加载组件 2018127

    在这个组件中,开发者可能对圆的填充进度和箭头的旋转角度进行动画处理,以呈现出平滑的加载效果。 为了实现可复用性,这个组件可能会被封装成一个自定义控件,遵循MVC(Model-View-Controller)架构。这样,其他...

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

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

    IOS应用源码——圆形箭头的加载组件.rar

    本资源提供的"圆形箭头的加载组件"是一个专门为iOS应用定制的源码,它实现了动态旋转的圆形箭头效果,以吸引用户的注意力并展示应用程序正在进行后台操作的状态。 这个加载组件可能包含了以下关键知识点: 1. **...

    jQuery实现的全屏3D旋转木马焦点图特效源码.zip

    4. **导航指示器**:通常,旋转木马会配有小圆点或箭头作为导航指示器,表示当前显示的图片位置,源码中应该也包含了这部分功能,帮助用户跟踪当前的展示状态。 5. **过渡动画**:在图片切换过程中,平滑的过渡动画...

    IOS应用源码Demo-圆形箭头的加载组件-毕设学习.zip

    2. **动画编程**:圆形箭头的加载效果通常涉及到旋转动画。这可能通过Core Animation或者UIView的动画块来实现。在iOS中,我们可以使用CAKeyframeAnimation来控制动画路径,使得箭头能够按照预期轨迹旋转。 3. **...

Global site tag (gtag.js) - Google Analytics