`
梦想家dream
  • 浏览: 64185 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Android自定义控件--3(刷新动画)

阅读更多
一个乐动力的刷新动画
package com.example.ledonglidemo;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.widget.ImageView;

public class GuideView extends ViewGroup {
	/**
	 * 左边的图片
	 */
	private ImageView left;
	/**
	 * 右边的图片
	 */
	private ImageView right;
	/**
	 * 上面的图片
	 */
	private ImageView top;
	/**
	 * 下面的图片
	 */
	private ImageView bottom;
	/**
	 * 中间的图片 m
	 */
	private ImageView center;
	/**
	 * 屏幕的宽度
	 */
	private int screenW;
	/**
	 * 屏幕的高度
	 */
	private int screenH;

	public GuideView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init(context);
	}

	public GuideView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init(context);
	}

	public GuideView(Context context) {
		super(context);
		init(context);
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		// TODO Auto-generated method stub
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
	}

	private List<Bitmap> bitmaps = new ArrayList<Bitmap>();

	private void init(Context context) {
		left = new ImageView(context);
		left.setImageBitmap(BitmapFactory.decodeResource(
				context.getResources(), R.drawable.day));
		bitmaps.add(BitmapFactory.decodeResource(context.getResources(),
				R.drawable.day));
		right = new ImageView(context);
		right.setImageBitmap(BitmapFactory.decodeResource(
				context.getResources(), R.drawable.night));
		bitmaps.add(BitmapFactory.decodeResource(context.getResources(),
				R.drawable.night));
		top = new ImageView(context);
		top.setImageBitmap(BitmapFactory.decodeResource(context.getResources(),
				R.drawable.up));
		bitmaps.add(BitmapFactory.decodeResource(context.getResources(),
				R.drawable.up));
		bottom = new ImageView(context);
		bottom.setImageBitmap(BitmapFactory.decodeResource(
				context.getResources(), R.drawable.down));
		bitmaps.add(BitmapFactory.decodeResource(context.getResources(),
				R.drawable.down));
		center = new ImageView(context);
		center.setImageBitmap(BitmapFactory.decodeResource(
				context.getResources(), R.drawable.animation_battery));
		bitmaps.add(BitmapFactory.decodeResource(context.getResources(),
				R.drawable.animation_battery));
		screenW = ((Activity) context).getWindowManager().getDefaultDisplay()
				.getWidth();
		screenH = ((Activity) context).getWindowManager().getDefaultDisplay()
				.getHeight();
		this.addView(center);
		this.addView(left);
		this.addView(right);
		this.addView(top);
		this.addView(bottom);

	}

	private LinearInterpolator interpolator = new LinearInterpolator();

	@Override
	protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
		// TODO Auto-generated method stub
		// 五个控件的布局
		center.layout(screenW / 2 - bitmaps.get(4).getWidth() / 2, screenH / 2
				- bitmaps.get(4).getHeight() / 2, screenW / 2
				+ bitmaps.get(4).getWidth() / 2, screenH / 2
				+ bitmaps.get(4).getHeight() / 2);
		top.layout(screenW / 2 - bitmaps.get(2).getWidth() / 2, screenH / 2
				- bitmaps.get(4).getHeight() / 2 - bitmaps.get(2).getHeight()
				+ bitmaps.get(2).getWidth() / 2 / 4,
				screenW / 2 + bitmaps.get(2).getWidth() / 2, screenH / 2
						- bitmaps.get(4).getHeight() / 2
						+ bitmaps.get(2).getWidth() / 2 / 4);
		left.layout(screenW / 2 - bitmaps.get(0).getWidth() * 2
				- bitmaps.get(0).getWidth() / 4, screenH / 2
				- bitmaps.get(0).getHeight() / 2, screenW / 2
				- bitmaps.get(0).getWidth() - bitmaps.get(0).getWidth() / 4,
				screenH / 2 + bitmaps.get(0).getHeight() / 2);
		right.layout(screenW / 2 + bitmaps.get(1).getWidth()
				+ bitmaps.get(1).getHeight() / 4, screenH / 2
				- bitmaps.get(1).getHeight() / 2, screenW / 2
				+ bitmaps.get(1).getWidth() * 2 + bitmaps.get(1).getHeight()
				/ 4, screenH / 2 + bitmaps.get(1).getHeight() / 2);
		bottom.layout(screenW / 2 - bitmaps.get(3).getWidth() / 2, screenH / 2
				+ bitmaps.get(4).getHeight() / 2 - bitmaps.get(3).getWidth()
				/ 2 / 4, screenW / 2 + bitmaps.get(3).getWidth() / 2, screenH
				/ 2 + bitmaps.get(4).getHeight() / 2
				+ bitmaps.get(3).getHeight() - bitmaps.get(3).getWidth() / 2
				/ 4);
		playCenter();
		playTop();
		playBottom();
		playLeft();
		playRight();
	}

	/**
	 * 右边的动画
	 */
	private void playRight() {
		// 混合动画
		AnimationSet animationSet = new AnimationSet(false);
		RotateAnimation rotateRight = new RotateAnimation(0, 359,
				Animation.ABSOLUTE, screenW / 2 - right.getLeft(),
				Animation.ABSOLUTE, (right.getBottom() - right.getTop()) / 2);
		RotateAnimation rotateSelf = new RotateAnimation(0, -359,
				Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
				0.5f);
		// 播放时间
		rotateSelf.setDuration(10 * 1000);
		// 播放加速的模式
		rotateSelf.setInterpolator(interpolator);
		// 设置无限循环
		rotateSelf.setRepeatCount(-1);
		rotateRight.setDuration(10 * 1000);
		rotateRight.setRepeatCount(-1);
		rotateRight.setInterpolator(interpolator);
		animationSet.addAnimation(rotateSelf);
		animationSet.addAnimation(rotateRight);
		// 播放混合动画
		right.startAnimation(animationSet);
	}

	/**
	 * 左边的动画
	 */
	private void playLeft() {
		AnimationSet animationSet = new AnimationSet(false);
		RotateAnimation rotateLeft = new RotateAnimation(0, 359,
				Animation.ABSOLUTE, screenW / 2 - left.getLeft(),
				Animation.ABSOLUTE, (left.getBottom() - left.getTop()) / 2);
		rotateLeft.setDuration(10 * 1000);
		rotateLeft.setInterpolator(interpolator);
		rotateLeft.setRepeatCount(-1);
		RotateAnimation rotateSelf = new RotateAnimation(0, -359,
				Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
				0.5f);
		rotateSelf.setDuration(10 * 1000);
		rotateSelf.setRepeatCount(-1);
		rotateSelf.setInterpolator(interpolator);
		animationSet.addAnimation(rotateSelf);
		animationSet.addAnimation(rotateLeft);
		left.startAnimation(animationSet);
	}

	/**
	 * 下面的动画
	 */
	private void playBottom() {
		RotateAnimation rotateBottom = new RotateAnimation(0, 359,
				Animation.RELATIVE_TO_SELF, 0.5f, Animation.ABSOLUTE, screenH
						/ 2 - bottom.getTop());
		rotateBottom.setDuration(10 * 1000);
		rotateBottom.setInterpolator(interpolator);
		rotateBottom.setRepeatCount(-1);
		bottom.startAnimation(rotateBottom);
	}

	/**
	 * 上面的动画
	 */
	private void playTop() {
		RotateAnimation rotateAnimation = new RotateAnimation(0, 359,
				Animation.ABSOLUTE, screenW / 2 - top.getLeft(),
				Animation.ABSOLUTE, screenH / 2 - top.getTop());
		rotateAnimation.setDuration(10 * 1000);
		rotateAnimation.setInterpolator(interpolator);
		rotateAnimation.setRepeatCount(-1);
		top.startAnimation(rotateAnimation);
	}

	/**
	 * 中间的View动画播放
	 */
	private void playCenter() {
		AnimationSet animationSet = new AnimationSet(false);
		ScaleAnimation scaleSmall = new ScaleAnimation(1.0f, 0.6f, 1.0f, 0.6f,
				Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
				0.5f);
		ScaleAnimation scaleBig = new ScaleAnimation(1.0f, 5.0f / 3, 1.0f,
				5.0f / 3, Animation.RELATIVE_TO_SELF, 0.5f,
				Animation.RELATIVE_TO_SELF, 0.5f);
		scaleBig.setDuration(2 * 1000);
		scaleBig.setInterpolator(interpolator);
		scaleSmall.setDuration(2 * 1000);
		scaleSmall.setStartOffset(2 * 1000);
		scaleSmall.setRepeatCount(-1);
		scaleSmall.setFillEnabled(true);
		scaleSmall.setFillAfter(true);
		scaleBig.setStartOffset(2 * 1000);
		scaleBig.setRepeatCount(-1);
		scaleBig.setFillEnabled(true);
		scaleBig.setFillAfter(true);
		scaleSmall.setInterpolator(interpolator);
		animationSet.addAnimation(scaleBig);
		animationSet.addAnimation(scaleSmall);
		center.startAnimation(animationSet);
	}

}


源码下载戳这里:
分享到:
评论

相关推荐

    自定义控件-pulltorefresh

    在Android开发中,"自定义控件-pulltorefresh"是一个常见的需求,指的是用户通过在屏幕顶部下拉来触发刷新操作的功能。这种交互模式在众多应用中被广泛使用,如新闻阅读、社交网络和电商应用等。"pulltorefresh"通常...

    自定义控件--点击随机数变换

    在Android开发中,自定义控件是提升应用独特性和用户体验的重要手段。本示例"自定义控件--点击随机数变换"由知名开发者鸿洋提供,旨在帮助开发者掌握如何创建并实现一个动态交互的自定义控件。在这个案例中,控件在...

    Android自定义控件示例

    这个压缩包“CustomViews”很可能是包含了一系列Android自定义控件的示例项目,旨在帮助开发者理解和学习如何在Android Studio 1.0.2环境下创建和使用自定义控件。 自定义控件通常涉及以下关键知识点: 1. **...

    Android自定义刷新控件

    "Android自定义刷新控件"这个主题主要关注如何扩展谷歌提供的SwipeRefreshLayout,以实现上拉加载更多的功能。SwipeRefreshLayout通常用于下拉刷新,它是一个包含一个子视图的布局,当用户向下滑动时,可以触发刷新...

    安卓自定义控件相关-Android自定义头部控件简单易用.rar

    本资源“安卓自定义控件相关-Android自定义头部控件简单易用.rar”提供了关于创建自定义头部控件的示例,这在构建具有个性化的APP时非常有用。 标题中的“自定义头部控件”通常指的是在应用顶部显示的区域,如导航...

    自定义控件---实现天气折线图效果

    在Android开发中,自定义控件是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何实现一个自定义控件,以展示天气折线图的效果,包括天气图片和温度显示等功能。 首先,创建一个自定义View类,继承自...

    自定义控件Demo

    在Android开发中,自定义控件是提升应用界面独特...通过学习和分析`customcontrols`中的代码,开发者可以深入理解Android自定义控件的工作原理,提高自己的Android开发技能,同时也能为今后的项目开发积累宝贵的经验。

    Android自定义控件下拉刷新实例代码

    总的来说,Android自定义控件的下拉刷新涉及到以下几个关键步骤: 1. 创建自定义布局,包含刷新指示器(如箭头和进度条)。 2. 在自定义视图中处理触摸事件,判断下拉手势并更新视图状态。 3. 触发刷新逻辑,加载新...

    安卓自定义控件相关-弹幕效果自定义View随机刷新数据.rar

    在Android开发中,自定义控件是提升应用独特性和用户体验的重要手段。本资源"安卓自定义控件相关-弹幕效果自定义View随机刷新数据.rar"聚焦于创建一个具有弹幕效果的自定义View,并能随机刷新显示的数据。在这个项目...

    自定义控件 - (年+月+日+时+分+秒)

    在Android开发中,自定义控件是提升应用个性化和功能扩展性的重要手段。"自定义控件 - (年+月+日+时+分+秒)"这个标题表明我们正在讨论如何创建一个显示完整时间(包括年、月、日、时、分、秒)的自定义控件。系统...

    android 自定义控件与特效

    在Android开发中,自定义控件与特效是提升应用界面独特性和用户...以上是Android自定义控件与特效的一些核心概念和实践技巧,开发者通过深入理解和熟练运用这些知识点,能够创建出独具特色且功能丰富的Android应用。

    android自定义组件(六) 刷新自定义控件

    总结来说,自定义Android刷新控件涉及到继承现有控件、重写关键方法、实现刷新动画、集成数据加载逻辑、提供可配置属性以及进行充分的测试。通过这样的步骤,我们可以创建出既满足功能需求又具有独特风格的自定义...

    android自定义控件之声音大小显示

    在Android开发中,自定义控件是提升应用用户体验和界面独特性的关键。本文将深入探讨如何创建一个自定义控件,用于根据麦克风输入的声音大小动态显示曲线图,并且该控件能响应触摸事件。我们将从以下几个方面进行...

    自定义控件练习Demo3-下拉刷新

    "自定义控件练习Demo3-下拉刷新"是一个典型的Android开发实战案例,它涉及到如何创建一个可下拉刷新的ListView,这一功能在众多移动应用中非常常见,如新闻阅读、社交应用等。下面将详细介绍这个知识点。 首先,...

    Android 自定义控件 时钟

    综上所述,创建一个Android自定义时钟控件是一个综合性的任务,涉及了Android UI编程、时间处理、动画和绘图等多个方面。通过学习和实践这个项目,开发者不仅可以提升自定义控件的技能,还能对Android系统有更深入的...

    【eoe+Android特刊】第十九期:Android自定义控件.pdf

    ### Android自定义控件知识点详解 #### 一、Android控件基本介绍 Android平台提供了丰富的控件库,这些控件可以满足大多数应用界面设计的需求。然而,在某些情况下,开发人员可能需要创建自己的自定义控件以实现...

    Android安卓源码-自定义控件类源代码(18例).zip

    以上就是这个压缩包中可能涵盖的一些关键知识点,通过学习这些示例,开发者可以掌握Android自定义控件的设计技巧,提升应用程序的定制化水平和用户体验。每个示例都可以作为模板,根据实际需求进行修改和扩展,从而...

    安卓自定义控件相关-高仿美团外卖加减号自定义控件.zip

    在Android开发中,自定义控件是提升应用界面独特性...对于想要深入学习Android自定义控件的开发者来说,这是一个很好的实践案例。通过阅读和分析源码,可以提升对Android视图机制的理解,为自己的项目增添更多可能性。

    安卓自定义控件相关-文字飞入飞出效果自定义View随机刷新数据.rar

    虽然这个压缩包中可能包含的代码示例可能需要调试和调整才能正常工作,但它们提供了一个很好的学习平台,可以帮助开发者深入理解Android自定义控件和动画的实现。通过分析和实践这些代码,你可以增强自己在Android...

Global site tag (gtag.js) - Google Analytics