`
lovelease
  • 浏览: 386463 次
社区版块
存档分类
最新评论

Android 控件自动“移入、暂停、移出”效果的实现

阅读更多
一个常见的效果:控件自动移入屏幕,停留几秒,再移出屏幕。项目中想做,但没找到合适的教程,于是自己写了一个工具类实现这个效果。本人初学android,实现方法肯定不是最优的,这只是一个没有办法的办法。构思很简单:两个动画,一个移入,一个移出,两个动画间插入一个计时器,以下是代码:
动画类(该类可以实现多个控件的同步动画,只要把所有控件传入构造方法即可,如果要执行不同的动画,各个控件单独调用就可以了,同时设置了一个开关用于控制是否执行“移出”的动作):
package net.jackie.util;

import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.view.animation.Animation.AnimationListener;

/**
 * @author jackie
 *
 */
public class MoveInAndOutAnim {

	private static final String TAG = "MoveInAndOutAnim";
	
	private int animDuration;
	private int fromXDelta;
	private int toXDelta;
	private int fromYDelta;
	private int toYDelt;
	private int keepDuration;
	private View[] views;
	private TranslateAnimation mMoveInAnim;
	private TranslateAnimation mMoveOutAnim;
	private TimerManager tm;
	private boolean processMoveOutAnim;
	
	/**
	 * 
	 * @param animDuration Duration of animation
	 * @param fromXDelta Change in X coordinate to apply at the start of the animation(generally 0)
	 * @param toXDelta Change in X coordinate to apply at the end of the animation
	 * 					(if you want to make a horizontal moving, move to right if positive value, move to left if negative value)
	 * @param fromYDelta Change in Y coordinate to apply at the start of the animation(generally 0)
	 * @param toYDelt Change in Y coordinate to apply at the end of the animation
	 * 					(if you want to make a vertical moving, move to bottom if positive value, move to top if negative value)
	 * @param keepDuration Duration to keep the Views displaying
	 * @param processMoveOutAnim whether to process the move out animation
	 * @param views Views to process the animation
	 */
	public MoveInAndOutAnim(int animDuration, int fromXDelta, int toXDelta,
			int fromYDelta, int toYDelt, int keepDuration, boolean processMoveOutAnim, View... views) {
		this.animDuration = animDuration;
		this.fromXDelta = fromXDelta;
		this.toXDelta = toXDelta;
		this.fromYDelta = fromYDelta;
		this.toYDelt = toYDelt;
		this.keepDuration = keepDuration;
		this.views = views;
		this.processMoveOutAnim = processMoveOutAnim;
		
		initMoveOutAnim();
		initMoveInAnim();
		initTimer();
	}
	
	private void initMoveInAnim() {
		mMoveInAnim = new TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelt);
		mMoveInAnim.setDuration(animDuration);
		mMoveInAnim.setFillAfter(true);
		mMoveInAnim.setAnimationListener(new AnimationListener() {
			@Override
			public void onAnimationStart(Animation animation) {
				
			}
			@Override
			public void onAnimationEnd(Animation animation) {
				if (processMoveOutAnim) {
					tm.startTimer();
				}
			}
			@Override
			public void onAnimationRepeat(Animation animation) {
				
			}
		});
	}
	
	private void initMoveOutAnim() {
		mMoveOutAnim = new TranslateAnimation(toXDelta, fromXDelta, toYDelt, fromYDelta);
		mMoveOutAnim.setDuration(animDuration);
		mMoveOutAnim.setFillBefore(true);
		mMoveOutAnim.setAnimationListener(new AnimationListener() {
			@Override
			public void onAnimationStart(Animation animation) {
				
			}
			@Override
			public void onAnimationEnd(Animation animation) {
				clearAnim();
			}
			@Override
			public void onAnimationRepeat(Animation animation) {
				
			}
		});
	}
	
	@SuppressLint("HandlerLeak")
	private void initTimer() {
		// Initial timer to control closing of 'Too Short' dialog
		// In fact, delay controls how long to keep the Views, so do not set it to 0
		tm = new TimerManager(keepDuration, keepDuration);
		Handler mHandler = new Handler() {
			@Override
			public void handleMessage(
					Message msg) {
				super.handleMessage(msg);
				
				switch(msg.what) {
				case TimerManager.LOAD_PROGRESS :
					for(View view : views) {
						view.startAnimation(mMoveOutAnim);
					}
					tm.closeTimer();
					break;
				case TimerManager.CLOSE_PROGRESS :
					// Do nothing
					Log.d(TAG, "Timer for 'Keep View' is closed.");
					break;
				}
			}
		};
		tm.setHandler(mHandler);
	}
	
	public void startAnim() {
		for(View view : views) {
			view.startAnimation(mMoveInAnim);
		}
	}
	
	private void clearAnim() {
		for(View view : views) {
			view.clearAnimation();
		}
	}
}


以上动画中用到了一个计时器类TimerManager,也是一个工具类,封装了一个计时器,可以单独用于计时器实例的取得:
package net.jackie.util;

import java.util.Timer;
import java.util.TimerTask;

import android.os.Handler;
import android.os.Message;

/**
 * Generate a timer object with specified 'delay' and 'period', 
 * you can handle events with 'TimerManager.LOAD_PROGRESS' 
 * and 'TimerManager.CLOSE_PROGRESS', then do your progress.
 * If you want to get 'timerId', just get it from 'arg1'
 * 
 * @author jackie
 *
 */
public class TimerManager {

	private Handler mHandler;
	/** Timer **/  
    private Timer timer = null;  
    /** TimerTask **/  
    private TimerTask timerTask = null;
    /** Delay Time in milliseconds **/  
    private int mDelay;
    /** Period in milliseconds **/  
    private int mPeriod;
    /** Timer in progressing flag **/  
    public static final int LOAD_PROGRESS = 0;  
    /** Timer close flag **/  
    public static final int CLOSE_PROGRESS = 1;  
    /** TimerId **/  
    private int mTimerId = 0;
    
    public TimerManager(int delay, int period) {
    	this.mDelay = delay;
    	this.mPeriod = period;
    }
    
    /**
     * 
     * @param handler your own handler to handle the events from this timer
     * @param delay amount of time in milliseconds before first execution
     * @param period amount of time in milliseconds between subsequent executions
     */
    public TimerManager(Handler handler, int delay, int period) {
    	this.mHandler = handler;
    	this.mDelay = delay;
    	this.mPeriod = period;
    }
    
	public void startTimer() {
        if (timerTask == null) {
            timerTask = new TimerTask() {
                @Override  
                public void run() {
                    Message msg = new Message();  
                    msg.what = LOAD_PROGRESS;  
                    msg.arg1 = (int) (++mTimerId);
                    if (mHandler != null) {
                    	mHandler.sendMessage(msg);
                    }
                }  
            };
            timer = new Timer();  
            timer.schedule(timerTask, mDelay, mPeriod);  
        }  
    }
  
    public void closeTimer() {
        if (timer != null) {  
            timer.cancel();  
            timer = null;  
        }  
        if (timerTask != null) {  
            timerTask = null;  
        }  
        mTimerId = 0;
        if (mHandler != null) {
        	mHandler.sendEmptyMessage(CLOSE_PROGRESS);
        }
    }
    
    public void setHandler(Handler handler) {
    	this.mHandler = handler;
    }
}


用法很简单,只要构造MoveInAndOutAnim,并调用startAnim方法即可:
MoveInAndOutAnim anim = new MoveInAndOutAnim(
								ANIMATION_DURATION, 0, 0, 0, topBarHeight,
								SHOW_ADDRESS_DELAY, true, showAddressLL, mLocationIv);
						anim.startAnim();

showAddressLL和mLocationIv就是我自己的两个控件,一个是LinearLayout一个是ImageView,我需要他们两个同步执行动画效果。
分享到:
评论

相关推荐

    VB image鼠标移入移出换图

    在这个"VB image鼠标移入移出换图"的主题中,我们将探讨如何利用VB的image控件以及鼠标事件来实现这一功能。 首先,VB中的Image控件是一个用于显示静态图像的组件,它支持多种图像格式,如BMP、JPEG、GIF等。Image...

    易语言捕获鼠标判断鼠标移入移出事件

    本篇文章将详细讲解如何在易语言中捕获鼠标事件,尤其是判断鼠标移入和移出事件。 首先,我们需要了解易语言中的“窗口矩形”概念。窗口矩形是指窗口在屏幕上的边界范围,通常由窗口的左上角坐标和右下角坐标定义。...

    易语言鼠标移入移出事件

    在易语言中,"鼠标移入移出事件"是编程中常见的交互功能,主要用于处理用户通过鼠标与界面元素的交互行为。本文将深入探讨易语言中的鼠标移入和移出事件,以及如何利用这些事件来增强程序的用户体验。 首先,我们...

    仿QQ好友动态添加说说、图片菜单滑动移进移出效果--在指定控件下面显示popupwindow动画不移效果

    要实现滑动移入移出的效果,我们需要使用Android的动画框架。动画框架提供了AlphaAnimation(透明度动画)、TranslateAnimation(位移动画)等多种动画类型。AlphaAnimation用于改变视图的透明度,而...

    易语言鼠标移入移出事件_例子源码,易语言鼠标移入移出事件模块源

    在图形用户界面(GUI)中,当鼠标指针进入或离开特定控件或窗口时,系统会触发相应的鼠标移入或移出事件。这些事件允许程序员在用户与界面交互时执行特定的操作,比如改变控件的外观、显示提示信息或者执行某项功能...

    鼠标移入移出事件模块

    在IT领域,鼠标移入移出事件是用户交互设计中的基本元素,主要用于增强用户体验和实现特定功能。在本文中,我们将深入探讨“鼠标移入移出事件模块”的系统结构、核心概念以及如何在实际编程中应用这些事件。 一、...

    PyQt实现自定义标题栏、鼠标移入移出效果切换、点击切换窗口界面等基本操作

    在PyQt5中,开发GUI应用程序时,我们有时需要对窗口进行自定义设计,比如创建一个自定义的标题栏,实现鼠标移入移出时的效果切换,以及点击标题栏可以切换窗口界面。以下是对这些功能的详细解释和实现方法。 首先,...

    Android 自动滚动banner控件

    总之,创建一个Android自动滚动的Banner控件,主要涉及ViewPager的使用、适配器的实现以及定时器的设置。通过合理的设计和第三方库的集成,我们可以轻松地实现这一功能,并提供良好的用户体验。在实际项目中,还需要...

    PictureBox闪烁解决

    新增鼠标单击、移入、移出颜色变化功能,在属性表中可以找到 【Label】 开启自适应微软雅黑字体,如果可以将尝试使用微软雅黑字体而不是丑陋的宋体 新增鼠标单击、移入、移出颜色变化功能,在属性表中可以找到 ...

    Android3D翻页效果的倒计时控件

    本知识点将详细介绍如何在Android中实现一个具有3D翻页效果的倒计时控件。这个控件不仅能够显示倒计时,还能通过上下翻转增加视觉吸引力,提升用户体验。 首先,我们需要理解倒计时控件的基本原理。在Android中,倒...

    Android 表格控件-动态实现表格效果(内容、样式可扩展)

    本教程将探讨如何利用Android的自定义View或者现有的布局控件,如LinearLayout、TableLayout、GridLayout等,来实现一个可扩展内容和样式的表格控件。我们将主要关注以下几个方面: 1. **TableLayout基础**: ...

    Android 滑动效果 自定义控件

    - **android:translationX** 和 **android:translationY**: 这两个属性可以用来平移视图,常用于滑动效果的实现。 在实际开发中,我们还可以利用Property Animation API或者ObjectAnimator来实现更复杂的滑动动画。...

    Winform ToolStrip控件左右拖拽移动效果实现

    ** 功能描述:ToolStrip控件左右拖拽移动效果实现 * 主窗体下部添加一个Panel乘放ToolStrip控件以实现ToolStrip在窗体下部定位。 * 当ToolStrip控件中子控件超出屏幕时,拖动控件可以实现滑动效果。拖动到控件...

    android控件的抖动效果, 可以实现上下,左右抖动效果

    总的来说,实现Android控件的抖动效果涉及到对Android动画系统的理解,以及选择合适的实现方式。无论是视图动画还是属性动画,或者使用第三方库,都能帮助开发者创造出生动有趣的用户界面。在实际项目中,根据目标...

    Android 分层级筛选控件

    这个控件可能扩展了Android的ExpandableListView或自定义了一个ViewGroup,实现了自定义的布局和交互效果。通过阅读和学习这段代码,开发者可以更深入地理解如何在Android中实现自定义控件,并应用于自己的项目中。 ...

    Android UI控件组件库集合【源码】

    这个"Android UI控件组件库集合【源码】"提供了多种常用的UI控件及其源代码,旨在帮助开发者构建更加美观、功能丰富的应用界面。下面我们将详细探讨这些控件以及它们在实际开发中的应用。 1. **流式布局...

    Android动态点点省略号闪烁效果的等待控件

    总结来说,Android动态点点省略号闪烁效果的等待控件是通过自定义View实现的,主要涉及XML布局定义、Java代码实现动态效果以及在Activity中使用这三个部分。开发者可以根据自己的需求灵活调整,以适应各种应用场景。

    易语言捕获鼠标判断鼠标移入移出事件源码.7z

    在GUI编程中,当鼠标进入或离开一个控件或窗口时,会触发相应的鼠标移入(Enter)和移出(Leave)事件。在易语言中,开发者可以通过监听这些事件来改变界面状态,比如高亮显示某个按钮,或者隐藏显示某些提示信息。...

    Android自动换行标签控件LineBreakLayout

    `LineBreakLayout`是一个专门用于实现自动换行标签效果的自定义控件,它解决了在一个有限的宽度内显示多个标签,并且能根据屏幕大小自动调整布局,使标签能够整齐、美观地换行显示。在本文中,我们将深入探讨`...

    android控件滑动和倒影

    "android控件滑动和倒影"的主题聚焦于如何在Android应用中实现图片按钮的滑动效果以及倒影(反射)效果。下面将详细解释这两个关键知识点。 首先,让我们探讨图片按钮的滑动效果。在Android中,滑动通常涉及到触摸...

Global site tag (gtag.js) - Google Analytics