/* * Copyright (C) 2012 www.amsoft.cn * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.ab.view.pullview; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import com.ab.util.AbDateUtil; import com.ab.util.AbFileUtil; import com.ab.util.AbViewUtil; // TODO: Auto-generated Javadoc /** * © 2012 amsoft.cn * 名称:AbListViewHeader.java * 描述:下拉刷新的Header View类. * * @author 还如一梦中 * @version v1.0 * @date:2013-01-17 下午11:52:13 */ public class AbListViewHeader extends LinearLayout { /** 上下文. */ private Context mContext; /** 主View. */ private LinearLayout headerView; /** 箭头图标View. */ private ImageView arrowImageView; /** 进度图标View. */ private ProgressBar headerProgressBar; /** 箭头图标. */ private Bitmap arrowImage = null; /** 文本提示的View. */ private TextView tipsTextview; /** 时间的View. */ private TextView headerTimeView; /** 当前状态. */ private int mState = -1; /** 向上的动画. */ private Animation mRotateUpAnim; /** 向下的动画. */ private Animation mRotateDownAnim; /** 动画时间. */ private final int ROTATE_ANIM_DURATION = 180; /** 显示 下拉刷新. */ public final static int STATE_NORMAL = 0; /** 显示 松开刷新. */ public final static int STATE_READY = 1; /** 显示 正在刷新.... */ public final static int STATE_REFRESHING = 2; /** 保存上一次的刷新时间. */ private String lastRefreshTime = null; /** Header的高度. */ private int headerHeight; /** * 初始化Header. * * @param context the context */ public AbListViewHeader(Context context) { super(context); initView(context); } /** * 初始化Header. * * @param context the context * @param attrs the attrs */ public AbListViewHeader(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } /** * 初始化View. * * @param context the context */ private void initView(Context context) { mContext = context; //顶部刷新栏整体内容 headerView = new LinearLayout(context); headerView.setOrientation(LinearLayout.HORIZONTAL); headerView.setGravity(Gravity.CENTER); AbViewUtil.setPadding(headerView, 0, 10, 0, 10); //显示箭头与进度 FrameLayout headImage = new FrameLayout(context); arrowImageView = new ImageView(context); //从包里获取的箭头图片 arrowImage = AbFileUtil.getBitmapFromSrc("image/arrow.png"); arrowImageView.setImageBitmap(arrowImage); //style="?android:attr/progressBarStyleSmall" 默认的样式 headerProgressBar = new ProgressBar(context,null,android.R.attr.progressBarStyle); headerProgressBar.setVisibility(View.GONE); LinearLayout.LayoutParams layoutParamsWW = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); layoutParamsWW.gravity = Gravity.CENTER; layoutParamsWW.width = AbViewUtil.scaleValue(mContext, 50); layoutParamsWW.height = AbViewUtil.scaleValue(mContext, 50); headImage.addView(arrowImageView,layoutParamsWW); headImage.addView(headerProgressBar,layoutParamsWW); //顶部刷新栏文本内容 LinearLayout headTextLayout = new LinearLayout(context); tipsTextview = new TextView(context); headerTimeView = new TextView(context); headTextLayout.setOrientation(LinearLayout.VERTICAL); headTextLayout.setGravity(Gravity.CENTER_VERTICAL); AbViewUtil.setPadding(headTextLayout,0, 0, 0, 0); LinearLayout.LayoutParams layoutParamsWW2 = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); headTextLayout.addView(tipsTextview,layoutParamsWW2); headTextLayout.addView(headerTimeView,layoutParamsWW2); tipsTextview.setTextColor(Color.rgb(107, 107, 107)); headerTimeView.setTextColor(Color.rgb(107, 107, 107)); AbViewUtil.setTextSize(tipsTextview,30); AbViewUtil.setTextSize(headerTimeView,27); LinearLayout.LayoutParams layoutParamsWW3 = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); layoutParamsWW3.gravity = Gravity.CENTER; layoutParamsWW3.rightMargin = AbViewUtil.scaleValue(mContext, 10); LinearLayout headerLayout = new LinearLayout(context); headerLayout.setOrientation(LinearLayout.HORIZONTAL); headerLayout.setGravity(Gravity.CENTER); headerLayout.addView(headImage,layoutParamsWW3); headerLayout.addView(headTextLayout,layoutParamsWW3); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); lp.gravity = Gravity.BOTTOM; //添加大布局 headerView.addView(headerLayout,lp); this.addView(headerView,lp); //获取View的高度 AbViewUtil.measureView(this); headerHeight = this.getMeasuredHeight(); mRotateUpAnim = new RotateAnimation(0.0f, -180.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); mRotateUpAnim.setDuration(ROTATE_ANIM_DURATION); mRotateUpAnim.setFillAfter(true); mRotateDownAnim = new RotateAnimation(-180.0f, 0.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); mRotateDownAnim.setDuration(ROTATE_ANIM_DURATION); mRotateDownAnim.setFillAfter(true); setState(STATE_NORMAL); } /** * 设置状态. * * @param state the new state */ public void setState(int state) { if (state == mState) return ; if (state == STATE_REFRESHING) { arrowImageView.clearAnimation(); arrowImageView.setVisibility(View.INVISIBLE); headerProgressBar.setVisibility(View.VISIBLE); } else { arrowImageView.setVisibility(View.VISIBLE); headerProgressBar.setVisibility(View.INVISIBLE); } switch(state){ case STATE_NORMAL: if (mState == STATE_READY) { arrowImageView.startAnimation(mRotateDownAnim); } if (mState == STATE_REFRESHING) { arrowImageView.clearAnimation(); } tipsTextview.setText("下拉刷新"); if(lastRefreshTime==null){ lastRefreshTime = AbDateUtil.getCurrentDate(AbDateUtil.dateFormatHMS); headerTimeView.setText("刷新时间:" + lastRefreshTime); }else{ headerTimeView.setText("上次刷新时间:" + lastRefreshTime); } break; case STATE_READY: if (mState != STATE_READY) { arrowImageView.clearAnimation(); arrowImageView.startAnimation(mRotateUpAnim); tipsTextview.setText("松开刷新"); headerTimeView.setText("上次刷新时间:" + lastRefreshTime); lastRefreshTime = AbDateUtil.getCurrentDate(AbDateUtil.dateFormatHMS); } break; case STATE_REFRESHING: tipsTextview.setText("正在刷新..."); headerTimeView.setText("本次刷新时间:" + lastRefreshTime); break; default: } mState = state; } /** * 设置header可见的高度. * * @param height the new visiable height */ public void setVisiableHeight(int height) { if (height < 0) height = 0; LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) headerView.getLayoutParams(); lp.height = height; headerView.setLayoutParams(lp); } /** * 获取header可见的高度. * * @return the visiable height */ public int getVisiableHeight() { LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)headerView.getLayoutParams(); return lp.height; } /** * 描述:获取HeaderView. * * @return the header view */ public LinearLayout getHeaderView() { return headerView; } /** * 设置上一次刷新时间. * * @param time 时间字符串 */ public void setRefreshTime(String time) { headerTimeView.setText(time); } /** * 获取header的高度. * * @return 高度 */ public int getHeaderHeight() { return headerHeight; } /** * 描述:设置字体颜色. * * @param color the new text color */ public void setTextColor(int color){ tipsTextview.setTextColor(color); headerTimeView.setTextColor(color); } /** * 描述:设置背景颜色. * * @param color the new background color */ public void setBackgroundColor(int color){ headerView.setBackgroundColor(color); } /** * 描述:获取Header ProgressBar,用于设置自定义样式. * * @return the header progress bar */ public ProgressBar getHeaderProgressBar() { return headerProgressBar; } /** * 描述:设置Header ProgressBar样式. * * @param indeterminateDrawable the new header progress bar drawable */ public void setHeaderProgressBarDrawable(Drawable indeterminateDrawable) { headerProgressBar.setIndeterminateDrawable(indeterminateDrawable); } /** * 描述:得到当前状态. * * @return the state */ public int getState(){ return mState; } /** * 设置提示状态文字的大小. * * @param size the new state text size */ public void setStateTextSize(int size) { tipsTextview.setTextSize(TypedValue.COMPLEX_UNIT_PX,size); } /** * 设置提示时间文字的大小. * * @param size the new time text size */ public void setTimeTextSize(int size) { headerTimeView.setTextSize(TypedValue.COMPLEX_UNIT_PX,size); } /** * Gets the arrow image view. * * @return the arrow image view */ public ImageView getArrowImageView() { return arrowImageView; } /** * 描述:设置顶部刷新图标. * * @param resId the new arrow image */ public void setArrowImage(int resId) { this.arrowImageView.setImageResource(resId); } public TextView getTipsTextview() { return tipsTextview; } public TextView getHeaderTimeView() { return headerTimeView; } }