android 横向滑动 回弹,android ScrollView水平滑动回弹

在研究了View的一些属性之后做了个Scroll的水平滑动回弹。

效果图:

0818b9ca8b590ca3270a3433284dd417.png

主要代码:

import android.content.Context;

import android.graphics.Rect;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

import android.view.animation.TranslateAnimation;

import android.widget.HorizontalScrollView;

/**

* ScrollView水平滑动回弹

*

* @author qhg

* @date 2014年3月12日

*

*/

public class MHorizontalScrollView extends HorizontalScrollView {

private View view;

/**

* 移动时的增量

*/

private static final int deltaX = 1;

private Rect normalRt = new Rect();

public MHorizontalScrollView(Context context) {

super(context);

}

public MHorizontalScrollView(Context context, AttributeSet attrs) {

super(context, attrs);

}

/**

* 在xml布局执行完后执行此方法

*/

protected void onFinishInflate() {

if (getChildCount() > 0) {

view = getChildAt(0);

}

}

@Override

public boolean onTouchEvent(MotionEvent event) {

if (view != null) {

onTouchEventImpl(event);

}

return super.onTouchEvent(event);

}

private void onTouchEventImpl(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_MOVE:

// 在当前视图内容继续偏移(x , y)个单位,显示(可视)区域也跟着偏移(x,y)个单位

scrollBy(deltaX, 0);

// 当滚动到最左或最右时就不会再滚动,这时移动布局达到回弹效果

if (isLayoutMove()) {

if (normalRt.isEmpty()) {

// 保存当前正常的布局位置,拉过头才能回弹到正常位置

normalRt.set(view.getLeft(), view.getTop(),

view.getRight(), view.getBottom());

}

// 移动布局

view.layout(view.getLeft() - deltaX, view.getTop(),

view.getRight() - deltaX, view.getBottom());

}

break;

case MotionEvent.ACTION_UP:

if (isNeedAnimation()) {

animationImpl();

}

break;

default:

break;

}

}

/**

* 动画移动

*/

private void animationImpl() {

// 移动动画

TranslateAnimation ta = new TranslateAnimation(view.getLeft(),

normalRt.left, 0, 0);

// 动画持续时间

ta.setDuration(50);

view.startAnimation(ta);

// 设置回到当前正常的布局位置

view.layout(normalRt.left, normalRt.top, normalRt.right,

normalRt.bottom);

normalRt.setEmpty();

}

/**

* 是否需要开启动画

*

* @return

*/

private boolean isNeedAnimation() {

return !normalRt.isEmpty();

}

/**

* 是否需要移动布局

*

* @return

*/

private boolean isLayoutMove() {

int offset = view.getMeasuredWidth() - getWidth();

if (offset <= 0) {

return false;

}

// 上面已固定deltaX=1,scrollX永远等于1所以向右拉不动

// 但当向左拉动到内容布局的最右端时scrollX == offset时还可以继续拉动

int scrollX = getScrollX();

if (scrollX == 0 || scrollX == offset) {

return true;

}

return false;

}

}

在xml布局文件里直接使用:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical"

android:background="@drawable/background"

>

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:scrollbars="none"

>

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="horizontal"

android:paddingTop="100dp"

android:id="@+id/ll_test"

android:onClick="test"

>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/house_1"

android:layout_marginRight="40dp"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/house_4"

android:layout_marginRight="40dp"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/house_2"

android:layout_marginRight="40dp"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/house_3"

android:layout_marginRight="40dp"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/house_1"

android:layout_marginRight="40dp"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/house_4"

android:layout_marginRight="40dp"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/house_2"

android:layout_marginRight="40dp"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/house_3"

android:layout_marginRight="40dp"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginRight="20dp"

/>

Android爱好者之家   QQ群1:321585812

群内会不定期更新传智播客黎老师的视频讲座,欢迎交流学习!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值