我们手机安装很多应用时,分屏摆放,不同屏的应用切换时的效果我们使用得多,如何实现呢?转载自:
(1)主界面代码SwitchViewDemoActivity.java:
package com.example.switchview; import android.app.Activity; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; public class SwitchViewDemoActivity extends Activity implements OnViewChangeListener, OnClickListener { private MyScrollLayout mScrollLayout; private ImageView[] mImageViews; private int mViewCount; private int mCurSel; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { mScrollLayout = (MyScrollLayout) findViewById(R.id.ScrollLayout); LinearLayout linearLayout = (LinearLayout) findViewById(R.id.llayout); //如果不想写死在布局文件里也可以动态添加,这里动态添加一个作为示例 // 动态添加一个layout控件 LinearLayout layout = new LinearLayout(this); layout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)); layout.setBackgroundResource(R.drawable.mm_1); mScrollLayout.addView(layout); // 动态添加一个imageView控件 ImageView imageView = new ImageView(this); LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); lp.gravity = Gravity.CENTER; imageView.setLayoutParams(lp); imageView.setPadding(15, 15, 15, 15); imageView.setImageResource(R.drawable.white_dot); linearLayout.addView(imageView); mViewCount = mScrollLayout.getChildCount(); mImageViews = new ImageView[mViewCount]; for (int i = 0; i < mViewCount; i++) { mImageViews[i] = (ImageView) linearLayout.getChildAt(i); mImageViews[i].setEnabled(true); mImageViews[i].setOnClickListener(this); mImageViews[i].setTag(i); } mCurSel = 0; mImageViews[mCurSel].setEnabled(false); mScrollLayout.SetOnViewChangeListener(this); } private void setCurPoint(int index) { if (index < 0 || index > mViewCount - 1 || mCurSel == index) { return; } mImageViews[mCurSel].setImageResource(R.drawable.white_dot); mImageViews[index].setImageResource(R.drawable.green_dot); mImageViews[mCurSel].setEnabled(true); mImageViews[index].setEnabled(false); mCurSel = index; } @Override public void OnViewChange(int view) { setCurPoint(view); } @Override public void onClick(View v) { int pos = (Integer) (v.getTag()); setCurPoint(pos); mScrollLayout.snapToScreen(pos); } }
(2) 主滑动自定义控件MyScrollLayout.java:
package com.example.switchview; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewGroup; import android.widget.Scroller; /** * 一组图片滑动主控件 * * @author chenwenbiao * @date 2014-6-7 下午3:55:12 * @version V1.0 */ public class MyScrollLayout extends ViewGroup { private VelocityTracker mVelocityTracker; // 用于判断甩动手势 private static final int SNAP_VELOCITY = 600; private Scroller mScroller; // 滑动控制器 private int mCurScreen; private int mDefaultScreen = 0; private float mLastMotionX; // private int mTouchSlop; private OnViewChangeListener mOnViewChangeListener; public MyScrollLayout(Context context) { super(context); // TODO Auto-generated constructor stub init(context); } public MyScrollLayout(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub init(context); } public MyScrollLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub init(context); } private void init(Context context) { mCurScreen = mDefaultScreen; // mTouchSlop = // ViewConfiguration.get(getContext()).getScaledTouchSlop(); mScroller = new Scroller(context); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { // TODO Auto-generated method stub 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) { final int childWidth = childView.getMeasuredWidth(); childView.layout(childLeft, 0, childLeft + childWidth, childView.getMeasuredHeight()); childLeft += childWidth; } } } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub super.onMeasure(widthMeasureSpec, heightMeasureSpec); final int width = MeasureSpec.getSize(widthMeasureSpec); final int widthMode = MeasureSpec.getMode(widthMeasureSpec); final int count = getChildCount(); for (int i = 0; i < count; i++) { getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec); } scrollTo(mCurScreen * width, 0); } public void snapToDestination() { final int screenWidth = getWidth(); final int destScreen = (getScrollX() + screenWidth / 2) / screenWidth; snapToScreen(destScreen); } public void snapToScreen(int whichScreen) { // get the valid layout page whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1)); if (getScrollX() != (whichScreen * getWidth())) { final int delta = whichScreen * getWidth() - getScrollX(); mScroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 2); mCurScreen = whichScreen; invalidate(); // Redraw the layout if (mOnViewChangeListener != null) { mOnViewChangeListener.OnViewChange(mCurScreen); } } } @Override public void computeScroll() { // TODO Auto-generated method stub if (mScroller.computeScrollOffset()) { scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); postInvalidate(); } } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub final int action = event.getAction(); final float x = event.getX(); final float y = event.getY(); switch (action) { case MotionEvent.ACTION_DOWN: Log.i("", "onTouchEvent ACTION_DOWN"); if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); mVelocityTracker.addMovement(event); } if (!mScroller.isFinished()) { mScroller.abortAnimation(); } mLastMotionX = x; break; case MotionEvent.ACTION_MOVE: int deltaX = (int) (mLastMotionX - x); if (IsCanMove(deltaX)) { if (mVelocityTracker != null) { mVelocityTracker.addMovement(event); } mLastMotionX = x; scrollBy(deltaX, 0); } break; case MotionEvent.ACTION_UP: int velocityX = 0; if (mVelocityTracker != null) { mVelocityTracker.addMovement(event); mVelocityTracker.computeCurrentVelocity(1000); velocityX = (int) mVelocityTracker.getXVelocity(); } if (velocityX > SNAP_VELOCITY && mCurScreen > 0) { // Fling enough to move left snapToScreen(mCurScreen - 1); } else if (velocityX < -SNAP_VELOCITY && mCurScreen < getChildCount() - 1) { // Fling enough to move right snapToScreen(mCurScreen + 1); } else { snapToDestination(); } if (mVelocityTracker != null) { mVelocityTracker.recycle(); mVelocityTracker = null; } // mTouchState = TOUCH_STATE_REST; break; } return true; } private boolean IsCanMove(int deltaX) { if (getScrollX() <= 0 && deltaX < 0) { return false; } if (getScrollX() >= (getChildCount() - 1) * getWidth() && deltaX > 0) { return false; } return true; } public void SetOnViewChangeListener(OnViewChangeListener listener) { mOnViewChangeListener = listener; } }
(3)接口OnViewChangeListener:
package com.example.switchview; public interface OnViewChangeListener { public void OnViewChange(int view); }
(4)布局文件activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <com.example.switchview.MyScrollLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ScrollLayout" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/mm_1" > </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/mm_2" > </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/mm_3" > </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/mm_4" > </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/mm_5" > </LinearLayout> </com.example.switchview.MyScrollLayout> <LinearLayout android:id="@+id/llayout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="24.0dip" android:orientation="horizontal" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:clickable="true" android:padding="15.0dip" android:src="@drawable/green_dot" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:clickable="true" android:padding="15.0dip" android:src="@drawable/white_dot" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:clickable="true" android:padding="15.0dip" android:src="@drawable/white_dot" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:clickable="true" android:padding="15.0dip" android:src="@drawable/white_dot" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:clickable="true" android:padding="15.0dip" android:src="@drawable/white_dot" /> </LinearLayout> </RelativeLayout>
效果图:
切换的都是图片,这里可能会使用到就是点,也上传了.
相关推荐
在Android应用开发中,微信引导界面(也称为启动页或引导流程)是用户首次打开应用时看到的一系列页面,它们通常包含吸引人的设计元素和简短的介绍,以引导用户了解应用的核心功能或特色。微信作为中国最流行的即时...
在iOS应用开发中,引导界面(也称为欢迎界面或启动屏幕)是用户首次打开应用时看到的短暂展示页面,它的设计旨在提供一个引人入胜的用户体验,同时也能加载应用程序的主要资源。本教程将深入探讨如何使用`...
【引导界面仿微信.zip】这个压缩包文件是一个关于Android应用开发的源码示例,主要目的是展示如何设计和实现一个类似微信的启动引导界面。在Android应用开发中,引导界面通常用于向用户介绍新功能或者突出应用的核心...
从引导界面过渡到主界面时,可以使用平滑的动画效果,比如淡入淡出或者滑动切换,这可以通过`ObjectAnimator`或`Transition`类实现。过渡动画可以提升用户体验,让应用看起来更加专业。 4. **异步加载与数据预处理...
8. **过渡效果**:引导界面与主应用界面之间的切换通常会有过渡动画,这可能是通过Transition API或者自定义动画实现的。通过源码分析,可以掌握如何在不同Activity之间创建平滑的过渡效果。 9. **异步加载**:如果...
5. **mojidemo**:这可能是主项目的源代码目录,包含了实现引导界面的Java或Kotlin类,以及布局文件XML等。开发者可以通过分析这些文件,了解如何在Android Studio中构建和设计类似的引导页。 在这个源码中,开发者...
本资源“安卓开发-Android应用源码高仿墨迹天气引导界面.zip”提供了一套完整的源码,用于实现类似墨迹天气应用的引导页效果。这个项目不仅适用于初学者学习Android UI设计,也对有经验的开发者有参考价值,可以快速...
该压缩包文件“安卓Android源码——引导界面仿人人网.zip”主要包含了创建一个类似人人网的安卓应用启动引导界面的源代码。引导界面在移动应用中通常用于首次启动时展示,向用户介绍应用的主要功能或特性,提升用户...
当标志存在时,应用可以直接跳过引导页面进入主界面。 8. **自调适和兼容性**: "程序如果跑不起来需要自调"提示开发者,SCViewPager可能需要根据具体设备和系统版本进行适配和调试。Android平台具有广泛的设备和...
本资源“安卓欢迎界面引导页面viewpager相关-Uber的欢迎界面.zip”提供了Uber应用的欢迎界面实现,采用ViewPager作为核心组件。ViewPager是一个强大的视图切换工具,常用于在多个页面间滑动浏览,非常适合构建欢迎...
"android应用源码仿微信用户引导页源码.zip" 提供了一个Android实例应用,用于帮助开发者理解和实现类似微信的用户引导页效果。 首先,我们要理解引导页的基本结构。一个简单的引导页通常包含几帧静态或动态图片,...
在Android应用开发中,新手引导和视图高亮提示是提升用户体验的重要手段,尤其是在初次使用应用时,能够帮助用户快速理解和熟悉应用的功能布局。本文将详细介绍如何在Android平台上实现这样的功能,让开发者能够轻松...
- **启动逻辑**:在MainActivity或者Application中控制引导页的显示和跳转到主界面的时机。 4. **自定义引导页** - **自定义动画**:除了使用系统提供的PageTransformer,还可以通过自定义ViewGroup或组合多个...
如果没有,就显示引导页,否则直接跳转到主界面。引导页完成后,更新SharedPreferences状态。 6. **动画和交互**:为了让引导页更吸引人,可以添加过渡动画和触摸反馈。例如,可以使用`ObjectAnimator`或自定义`...
在Android应用开发中,创建一个吸引用户的初始化界面(也称为启动屏幕或引导页面)是非常常见的做法,这可以增强用户体验并展示应用的品牌形象。本项目利用ViewPager实现了一个Android程序安装后的开场界面,它允许...
此外,引导页通常还包括一个“开始使用”或“跳过”按钮,这可以通过`Button`控件实现,设置相应的点击事件来启动应用主界面或跳过引导页。 在实现过程中,Android的布局文件(XML)会定义每个引导页的视图结构,...
7. **逻辑控制**:最后,需要在主界面的入口处检查用户是否需要看到引导页,如果需要,则显示ViewPager引导页;否则直接进入主界面。 在实现过程中,可能还会遇到一些问题,例如页面滑动速度的控制、页面间的过渡...
3. **首次启动引导界面** 首次启动应用时,许多应用会展示一个引导页面序列,帮助用户了解应用的主要功能。在这个例子中,当应用第一次启动时,会显示引导界面。这通常通过在启动时检查SharedPreferences等持久化...