Android之ScrollLayout左右滑动效果实现

本篇文章使用一个小程序实现Android之ScrollLayout左右滑动效果


第一步:新建Android工程

添加图片资源,并设置效果

<?xml version="1.0" encoding="utf-8"?>
<selector
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="true" android:drawable="@drawable/page_indicator_unfocused" />
    <item android:state_enabled="false" android:drawable="@drawable/page_indicator_focused" />
</selector>

第二步:添加实现左右滑动效果的源文件

1.视图改变接口

public interface OnViewChangeListener {
	public void OnViewChange(int view);
}


2.实现左右滑动效果的源文件,以后我们可以直接使用这个文件

public class MyScrollLayout extends ViewGroup
{
	private static final String TAG = "ScrollLayout";
	private VelocityTracker mVelocityTracker;// 用于判断甩动手势
	private Scroller mScroller;// 滑动控制
	private int mCurScreen;
	private int mDefaultScreen = 0;
	private float mLastMotionX; // 手指移动的时候,或者手指离开屏幕的时候记录下的手指的横坐标
	private float mLastMotionY; // 手指移动的时候,或者手指离开屏幕的时候记录下的手指的纵坐标
	private int mTouchSlop;// 手指移动的最小距离的判断标准
							// =ViewConfiguration.get(getContext()).getScaledTouchSlop();
							// 在viewpapper中就是依赖于这个值来判断用户
							// 手指滑动的距离是否达到界面滑动的标准
	private static final int SNAP_VELOCITY = 600;// 默认的滚动速度,之后用于和手指滑动产生的速度比较,获取屏幕滚动的速度
	private static final int TOUCH_STATE_REST = 0;//表示触摸状态为空闲,即没有触摸或者手指离开了
	private static final int TOUCH_STATE_SCROLLING = 1;//表示手指正在移动
	private int mTouchState = TOUCH_STATE_REST;// 当前手指的事件状态
	
	private OnViewChangeListener mOnViewChangeListener;
	
	public MyScrollLayout(Context context)
	{
		super(context);
		Log.i(TAG, "---ScrollLyout1---");
		init(context);
	}
	public MyScrollLayout(Context context, AttributeSet attrs)
	{
		super(context, attrs);
		Log.i(TAG, "---ScrollLyout2---");
		init(context);
	}
	public MyScrollLayout(Context context, AttributeSet attrs, int defStyle)
	{
		super(context, attrs, defStyle);
		Log.i(TAG, "---ScrollLyout3---");
		init(context);
	}
	private void init(Context context)
	{
		mCurScreen = mDefaultScreen;
		mScroller = new Scroller(context);
		mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); // 使用系统默认的值
	}
	
	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b)
	{
		Log.i(TAG, "---onLayout---");
		// 为每一个孩子设置它们的位置
		if(changed)
		{
			int childLeft = 0;
			final int childCount = getChildCount();
			for(int i=0; i<childCount; i++)
			{
				final View childView = getChildAt(i);
				if (childView.getVisibility() != View.GONE)
				{
					// 此处获取到的宽度就是在onMeasure中设置的值
					final int childWidth = childView.getMeasuredWidth();
					// 为每一个子View布局
					childView.layout(childLeft, 0, childLeft+childWidth, childView.getMeasuredHeight());
					childLeft = childLeft + childWidth;
				}
			}
		}
	}
	
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
	{
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		Log.i(TAG, "---onMeasure---");
		// 在onlayout之前执行,获取View申请的大小,把它们保存下来,方面后面使用
		final i
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在Qt中,可以使用QScrollArea来实现在QVBoxLayout内动态添加控件,并使其能够上下滑动而不是堆积在一页。首先,创建一个QVBoxLayout对象,并将其设置为QScrollArea的垂直布局。 ```cpp QScrollArea* scrollArea = new QScrollArea; QWidget* scrollWidget = new QWidget; QVBoxLayout* layout = new QVBoxLayout(scrollWidget); scrollArea->setWidget(scrollWidget); scrollArea->setWidgetResizable(true); // 动态添加控件 for(int i = 0; i < 控件数量; i++){ QWidget* widget = new QWidget; layout->addWidget(widget); // 为控件设置内容和属性 } scrollArea->show(); ``` 首先,我们创建一个QScrollArea对象和一个QWidget对象(scrollWidget),后者将用作QScrollArea的子部件。然后,再在scrollWidget上创建一个QVBoxLayout对象(layout)作为其窗口布局。这样,我们就可以用这个垂直布局来添加我们想要的控件。 在动态添加控件时,我们创建一个QWidget对象(widget),并将其添加到垂直布局(layout)中。在这里,你可以为控件设置内容和属性。 最后,我们将scrollWidget设置为QScrollArea的窗口部件,使用setWidgetResizable(true)使其能够自动调整大小适应窗口,并调用show()将QScrollArea显示在屏幕上。这样,我们就可以通过滚动来查看添加的控件,并且控件不会堆积在一起。 ### 回答2: 在Qt中,可以使用QScrollArea来实现在Qt VerticalLayout内动态添加控件并实现上下滑动效果,而不是堆积在一页。 首先,我们需要在UI界面中添加一个QScrollArea,并将其垂直滚动条的策略设置为"AlwaysOn",确保垂直滚动条一直显示。然后,我们将QScrollArea的属性widgetResizable设置为true,以便自动调整内部widget的大小。 接下来,在垂直滚动区内创建一个QWidget,并使用QVBoxLayout作为其布局管理器。这个QWidget将作为QScrollArea的内部widget,所有动态添加的控件都将添加到这个QWidget中。 然后,我们可以按照需要动态创建所需的控件,并使用addWidget()方法将其添加到QVBoxLayout中。在添加完所有控件后,我们还可以使用QSpacerItem来创建一个占位符,以便在需要时调整布局。 最后,将这个QWidget设置为QScrollArea的widget,这样就可以通过滚动条来上下滑动动态添加的控件了。 具体实现代码如下: // 创建滚动区 QScrollArea *scrollArea = new QScrollArea(this); scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); scrollArea->setWidgetResizable(true); // 创建内部widget和布局管理器 QWidget *scrollWidget = new QWidget(scrollArea); QVBoxLayout *scrollLayout = new QVBoxLayout(scrollWidget); // 创建并添加动态的控件到布局中 for(int i=0; i<10; i++) { QLabel *label = new QLabel(QString("Label %1").arg(i+1)); scrollLayout->addWidget(label); } // 创建一个占位符 QSpacerItem *spacer = new QSpacerItem(10, 10, QSizePolicy::Minimum, QSizePolicy::Expanding); scrollLayout->addItem(spacer); // 设置滚动区的内部widget并显示 scrollArea->setWidget(scrollWidget); scrollArea->show(); 这样,我们就可以在Qt VerticalLayout内动态添加控件,并且通过滚动条来实现上下滑动效果,避免了控件的堆积。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值