android 日历动画的实现

本文介绍了如何在Android中实现日历动画效果。通过在一个ViewPager中承载每天的日历活动ListView,实现向上滑动时,ViewPager跟随滑动并仅显示一行,ListView滑动至其下方。难点在于在CalendarContainer(FrameLayout的子类)中拦截ListView的滑动事件,并在onInterceptTouchEvent中处理动画逻辑。
摘要由CSDN通过智能技术生成

华为P8日历的截图


目前仅实现动画,内容没有填充,效果如下图


布局分析

承载日历网格的是一个ViewPager,每天的日历活动是一个ListView,需要实现的效果是,在listview区域向上滑动,viewpager也跟着滑动,滑动后viewpaer只留下一行,listview滑动到这一行的下面。

难点在于拦截listview的滑动事件。


实现分析

使用CalendarContainer(继承自FrameLayout)作为ViewPager和listView的父空间,在CalendarContainer的onInterceptTouchEvent中判断拦截listview的滑动事件,并处理滑动动画。


CalendarContainer类文件;

package com.example.test;

import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
import android.animation.AnimatorSet;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.FrameLayout;

/**
 * @author whuthm
 * @date 2015-6-12
 */
public class CalendarContainer extends FrameLayout {
	/** 停止滚动 */
	public static final int SCROLL_STATE_IDLE = 0;
	/** 手指在屏幕上正在滚动 */
	public static final int SCROLL_STATE_TOUCH_SCROLL = 1;
	/** 手指离开屏幕滚动 */
	public static final int SCROLL_STATE_FLING = 2;

	private int mScrollState = SCROLL_STATE_IDLE;

	private VelocityTracker mVelocityTracker;

	private CalendarListView mListView;
	private CalendarViewPager mViewPager;

	private int mRowHeight = 150;
	private int mRowCount = 5;

	private int mSelecteRow = 2;

	private float mLastMotionY;

	private boolean mIsOnSlidablyArea = false;

	private int mTouchSlop;

	/** view是否展开 */
	private boolean mExpanded = true;

	public CalendarContainer(Context context) {
		this(context, null);
	}

	public CalendarContainer(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

	public CalendarContainer(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);

		final ViewConfiguration configuration = ViewConfiguration
				.get(getContext());
		mTouchSlop = configuration.getScaledTouchSlop();

		mViewPager = new C
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值