资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

怎么在Android中实现一个下拉阻尼效应

本篇文章给大家分享的是有关怎么在Android中实现一个下拉阻尼效应,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

成都创新互联公司于2013年成立,是专业互联网技术服务公司,拥有项目成都网站制作、成都网站设计网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元楚雄州做网站,已为上家服务,为楚雄州各地企业和个人服务,联系电话:13518219792

public class MyView extends ScrollView {
	//记录下最开始点击的位置
	int initY;
	//移动的位置
	int deltaY;
	
	int touchY;
	//记录第一个item的位置的矩形
	Rect topRect;
	//用来存放第一个可见的item
	View inner;
	//记录下ImageView最原始的顶部位置和底部位置
	int initTop,initButtom;
	int left = 0,top = 0,right = 0,bottom = 0;
	ImageView imageView;
	State state;
	 boolean recordFlag;
	 enum State
	{
		UP,NORMAL,DOWN
	}
	
	 
	boolean isMoving;
	boolean shutScroll;
	private int current_Bottom;
	private int current_Top;
	
	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		state = State.NORMAL;
		topRect=new Rect();
		recordFlag=false;
		
	}
	public void setImageView(ImageView imageView)
	{
		this.imageView=imageView;
	}
	
	//当布局加载完成之后调用该方法
	@Override
	protected void onFinishInflate() {
		super.onFinishInflate();
		//返回加载完成后所看到的第一个item,这里就是看到的第一个item,通过对该对象的移动来实现整体的移动
		inner=getChildAt(0);
		Log.i("inner", inner.toString());
	}
	//onTouchEvent的返回值 返回true的话表示该事件已经被处理了,返回false表示改时间还未被处理
	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		if(inner!=null)
		{
			commOnTouchEvent(ev);
			
		}
		if(shutScroll)
		{
			return true;
		}else
		{
			return super.onTouchEvent(ev);
		}
		
	}
	private void commOnTouchEvent(MotionEvent ev) {
		switch(ev.getAction())
		{
		case MotionEvent.ACTION_DOWN:
		{
			if(recordFlag==false)
			{
				left=inner.getLeft();
				top=inner.getTop();
				right=inner.getRight();
				bottom=inner.getBottom();
				recordFlag=true;
			}
			
			//开始的时候接触点的坐标值
			initY=(int) ev.getY();
			//记录下ImageView的原始高度
			initTop=imageView.getTop();
			//记录下ImageView的原始的底部的像素坐标
			initButtom=imageView.getBottom();
			break;
		}
		
		case MotionEvent.ACTION_MOVE:
		{
			//滑动的距离
			deltaY=(int) (ev.getY()-initY);
			
			if(deltaY<0)
			{
				//向上滑动
				state=State.UP;	
				isMoving=false;
				shutScroll=false;
			}
			else if(deltaY>=0)
			{
				//在这里做一下判断,当getScrollY为0时,继续下拉就会进入down状态。
				if(getScrollY()==0)
				{
					//向下滑动
					state=State.DOWN;
					isMoving=true;
					shutScroll=true;
				}
				
			}
			
			if(isMoving)
			{
				if (topRect.isEmpty()) {
					
					// 保存正常的布局位置
					topRect.set(left, top,right,bottom);
				}
					
				float inner_move_H = deltaY / 5;
				inner.layout(topRect.left, (int) (topRect.top + inner_move_H),
							topRect.right, (int) (topRect.bottom + inner_move_H));
				float image_move_H = deltaY / 10;
				current_Top = (int) (initTop + image_move_H);
				current_Bottom = (int) (initButtom + image_move_H);
				imageView.layout(imageView.getLeft(), current_Top,
							imageView.getRight(), current_Bottom);
				
			}
			break;
		}
		
		
		case MotionEvent.ACTION_UP:
		{
			if(needToScroll())
			{
				animation();
				
			}
			if(getScrollY()==0)
			{
				/*这里为什么要这么写呢?这里有很重要的一个知识点:
				 * getScrollY()返回的是手机屏幕左上角和调用该方法的view的左上角之间的Y坐标只差。
				 * 在这里,自定义空间的布局方式看看布局文件就会发现,当View滑动的时候,View的状态在up,normal;
				 * down之间切换。在View下来的过程中,normal和down有一个临界值,这个临界值就是该view的
				 * 左上角是不是和屏幕的左上角相等。相等的话就说明再向下拉的话就down状态了。*/	
				
				state=State.NORMAL;
			}
			break;
		}
		}
		
	}
	private void animation() {
		//背景图片平移的动画
		TranslateAnimation image_Anim = new TranslateAnimation(0, 0,
				Math.abs(initTop - current_Top), 0);
		image_Anim.setDuration(200);
		imageView.startAnimation(image_Anim);
		imageView.layout(imageView.getLeft(), (int) initTop,
				imageView.getRight(), (int) initButtom);
		// 开启移动动画
		TranslateAnimation inner_Anim = new TranslateAnimation(0, 0,
				inner.getTop(), topRect.top);
		inner_Anim.setDuration(200);
		inner.startAnimation(inner_Anim);
		inner.layout(topRect.left, topRect.top, topRect.right, topRect.bottom);
		//state=State.NORMAL;
		topRect.setEmpty();
	}
	private boolean needToScroll() {
		if(state==State.DOWN)
		{
			return true;
		}
		return false;
	}
}

以上就是怎么在Android中实现一个下拉阻尼效应,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。


文章名称:怎么在Android中实现一个下拉阻尼效应
链接分享:http://cdkjz.cn/article/ggjcpd.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220