android中提供了4中动画:
AlphaAnimation 透明度动画效果
ScaleAnimation 缩放动画效果
TranslateAnimation 位移动画效果
RotateAnimation 旋转动画效果

本节讲解RotateAnimation 动画,
RotateAnimation (float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
参数说明:
float fromDegrees:旋转的开始角度。
float toDegrees:旋转的结束角度。
int pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
float pivotXValue:X坐标的伸缩值。
int pivotYType:Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
float pivotYValue:Y坐标的伸缩值。
代码:

复制代码代码如下:
public class MainActivity extends Activity {
ImageView image;
Button start;
Button cancel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = (ImageView) findViewById(R.id.main_img);
start = (Button) findViewById(R.id.main_start);
cancel = (Button) findViewById(R.id.main_cancel);
/** 设置旋转动画 */
final RotateAnimation animation =new RotateAnimation(0f,360f,Animation.RELATIVE_TO_SELF,
0.5f,Animation.RELATIVE_TO_SELF,0.5f);
animation.setDuration(3000);//设置动画持续时间
/** 常用方法 */
//animation.setRepeatCount(int repeatCount);//设置重复次数
//animation.setFillAfter(boolean);//动画执行完后是否停留在执行完的状态
//animation.setStartOffset(long startOffset);//执行前的等待时间
start.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
image.setAnimation(animation);
/** 开始动画 */
animation.startNow();
}
});
cancel.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
/** 结束动画 */
animation.cancel();
}
});
}

}


应用 :listview 上拉刷新,下拉加载箭头

package com.imooc.listviewfrashdemo1;import java.text.SimpleDateFormat;import java.util.Date;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.view.animation.RotateAnimation;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.ImageView;import android.widget.ListView;import android.widget.ProgressBar;import android.widget.TextView;import com.example.listviewfrashdemo1.R;public class ReFlashListView extends ListView implements OnScrollListener {View header;// 顶部布局文件;int headerHeight;// 顶部布局文件的高度;int firstVisibleItem;// 当前第一个可见的item的位置;int scrollState;// listview 当前滚动状态;boolean isRemark;// 标记,当前是在listview最顶端摁下的;int startY;// 摁下时的Y值;int state;// 当前的状态;final int NONE = 0;// 正常状态;final int PULL = 1;// 提示下拉状态;final int RELESE = 2;// 提示释放状态;final int REFLASHING = 3;// 刷新状态;IReflashListener iReflashListener;//刷新数据的接口View footer;// 底部布局;int totalItemCount;// 总数量;int lastVisibleItem;// 最后一个可见的item;boolean isLoading;// 正在加载;ILoadListener iLoadListener;public ReFlashListView(Context context) {super(context);initView(context);}public ReFlashListView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubinitView(context);}public ReFlashListView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stubinitView(context);}/** * 初始化界面,添加顶部布局文件到 listview *  * @param context */private void initView(Context context) {LayoutInflater inflater = LayoutInflater.from(context);header = inflater.inflate(R.layout.header_layout, null);measureView(header);headerHeight = header.getMeasuredHeight();Log.i("tag", "headerHeight = " + headerHeight);topPadding(-headerHeight);this.addHeaderView(header);footer = inflater.inflate(R.layout.footer_layout, null);footer.findViewById(R.id.load_layout).setVisibility(View.GONE);this.addFooterView(footer);this.setOnScrollListener(this);}/** * 通知父布局,占用的宽,高; *  * @param view */private void measureView(View view) {ViewGroup.LayoutParams p = view.getLayoutParams();if (p == null) {p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);}int width = ViewGroup.getChildMeasureSpec(0, 0, p.width);int height;int tempHeight = p.height;if (tempHeight > 0) {height = MeasureSpec.makeMeasureSpec(tempHeight,MeasureSpec.EXACTLY);} else {height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);}view.measure(width, height);}/** * 设置header 布局 上边距; *  * @param topPadding */private void topPadding(int topPadding) {header.setPadding(header.getPaddingLeft(), topPadding,header.getPaddingRight(), header.getPaddingBottom());header.invalidate();}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {// TODO Auto-generated method stubthis.firstVisibleItem = firstVisibleItem;this.lastVisibleItem = firstVisibleItem + visibleItemCount;this.totalItemCount = totalItemCount;}@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {// TODO Auto-generated method stubthis.scrollState = scrollState;if (totalItemCount == lastVisibleItem&& scrollState == SCROLL_STATE_IDLE) {if (!isLoading) {isLoading = true;footer.findViewById(R.id.load_layout).setVisibility(View.VISIBLE);// 加载更多iLoadListener.onLoad();}}}@Overridepublic boolean onTouchEvent(MotionEvent ev) {// TODO Auto-generated method stubswitch (ev.getAction()) {case MotionEvent.ACTION_DOWN:if (firstVisibleItem == 0) {isRemark = true;startY = (int) ev.getY();}break;case MotionEvent.ACTION_MOVE:onMove(ev);break;case MotionEvent.ACTION_UP:if (state == RELESE) {state = REFLASHING;// 加载最新数据;reflashViewByState();iReflashListener.onReflash();} else if (state == PULL) {state = NONE;isRemark = false;reflashViewByState();}break;}return super.onTouchEvent(ev);}/** * 判断移动过程操作; *  * @param ev */private void onMove(MotionEvent ev) {if (!isRemark) {return;}int tempY = (int) ev.getY();int space = tempY - startY;int topPadding = space - headerHeight;switch (state) {case NONE:if (space > 0) {state = PULL;reflashViewByState();}break;case PULL:topPadding(topPadding);if (space > headerHeight + 30&& scrollState == SCROLL_STATE_TOUCH_SCROLL) {state = RELESE;reflashViewByState();}break;case RELESE:topPadding(topPadding);if (space < headerHeight + 30) {state = PULL;reflashViewByState();} else if (space <= 0) {state = NONE;isRemark = false;reflashViewByState();}break;}}/** * 根据当前状态,改变界面显示; */private void reflashViewByState() {TextView tip = (TextView) header.findViewById(R.id.tip);ImageView arrow = (ImageView) header.findViewById(R.id.arrow);ProgressBar progress = (ProgressBar) header.findViewById(R.id.progress);/**  William 2016年1月7日14:51:43 float fromDegrees:旋转的开始角度。  float toDegrees:旋转的结束角度。  int pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。 float pivotXValue:X坐标的伸缩值。  int pivotYType:Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。 float pivotYValue:Y坐标的伸缩值。  */RotateAnimation anim = new RotateAnimation(0, 180,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);anim.setDuration(500);anim.setFillAfter(true);RotateAnimation anim1 = new RotateAnimation(180, 0,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);anim1.setDuration(500);anim1.setFillAfter(true);switch (state) {case NONE:arrow.clearAnimation();topPadding(-headerHeight);break;case PULL:arrow.setVisibility(View.VISIBLE);progress.setVisibility(View.GONE);tip.setText("下拉可以刷新!");arrow.clearAnimation();arrow.setAnimation(anim1);break;case RELESE:arrow.setVisibility(View.VISIBLE);progress.setVisibility(View.GONE);tip.setText("松开可以刷新!");arrow.clearAnimation();arrow.setAnimation(anim);break;case REFLASHING:topPadding(50);arrow.setVisibility(View.GONE);progress.setVisibility(View.VISIBLE);tip.setText("正在刷新...");arrow.clearAnimation();break;}}/** * 获取完数据; */public void reflashComplete() {state = NONE;isRemark = false;reflashViewByState();TextView lastupdatetime = (TextView) header.findViewById(R.id.lastupdate_time);SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");Date date = new Date(System.currentTimeMillis());String time = format.format(date);lastupdatetime.setText(time);}public void setReflashListener(IReflashListener iReflashListener){this.iReflashListener = iReflashListener;}public void setILoadListener(ILoadListener iLoadListener){this.iLoadListener = iLoadListener;}/** * 刷新数据接口 * @author Administrator */public interface IReflashListener{public void onReflash();}/** * 加载完毕 */public void loadComplete(){isLoading = false;footer.findViewById(R.id.load_layout).setVisibility(View.GONE);}//加载更多数据的回调接口public interface ILoadListener{public void onLoad();}}


更多相关文章

  1. android获取手机电话信息
  2. android动画及用法
  3. Android程序中输入法弹出的时候如何不遮挡输入,与布局相配
  4. android 动画使用
  5. (转载)Android一些不常见的API及一些其他注意事项
  6. Android加载动画库
  7. Android(安卓)动画学习笔记
  8. Android判断是Wifi还是4G网络代码

随机推荐

  1. Android(安卓)性能优化之使用MAT分析内存
  2. android 照相
  3. Android(安卓)日历开发教程[五]
  4. Android(安卓)Binder机制浅析及AIDL的使
  5. Android(安卓)Studio的使用
  6. Android消息通知-Notification
  7. 使用android快速开发框架afinal的FinalDb
  8. Android下常见的内存泄露 经典
  9. Android(安卓)root权限获取原理详解
  10. Android两种虚拟机区别和联系