`

启动引导界面实现(类似手机主界面切换应用屏幕)

 
阅读更多

我们手机安装很多应用时,分屏摆放,不同屏的应用切换时的效果我们使用得多,如何实现呢?转载自:

高仿launcher和墨迹左右拖动效果

 

(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>

 

效果图:

 

 

 

切换的都是图片,这里可能会使用到就是点,也上传了.

 

  • 大小: 1.3 MB
  • 大小: 1.2 MB
  • 大小: 17.7 KB
  • 大小: 17.6 KB
分享到:
评论

相关推荐

    微信引导界面

    在Android应用开发中,微信引导界面(也称为启动页或引导流程)是用户首次打开应用时看到的一系列页面,它们通常包含吸引人的设计元素和简短的介绍,以引导用户了解应用的核心功能或特色。微信作为中国最流行的即时...

    IOS引导界面 欢迎界面

    在iOS应用开发中,引导界面(也称为欢迎界面或启动屏幕)是用户首次打开应用时看到的短暂展示页面,它的设计旨在提供一个引人入胜的用户体验,同时也能加载应用程序的主要资源。本教程将深入探讨如何使用`...

    Android应用源码之引导界面仿微信.zip

    【引导界面仿微信.zip】这个压缩包文件是一个关于Android应用开发的源码示例,主要目的是展示如何设计和实现一个类似微信的启动引导界面。在Android应用开发中,引导界面通常用于向用户介绍新功能或者突出应用的核心...

    Android应用源码之引导界面仿微信.rar

    从引导界面过渡到主界面时,可以使用平滑的动画效果,比如淡入淡出或者滑动切换,这可以通过`ObjectAnimator`或`Transition`类实现。过渡动画可以提升用户体验,让应用看起来更加专业。 4. **异步加载与数据预处理...

    Android应用源码之引导界面仿微信-IT计算机-毕业设计.zip

    8. **过渡效果**:引导界面与主应用界面之间的切换通常会有过渡动画,这可能是通过Transition API或者自定义动画实现的。通过源码分析,可以掌握如何在不同Activity之间创建平滑的过渡效果。 9. **异步加载**:如果...

    Android应用源码高仿墨迹天气引导界面

    5. **mojidemo**:这可能是主项目的源代码目录,包含了实现引导界面的Java或Kotlin类,以及布局文件XML等。开发者可以通过分析这些文件,了解如何在Android Studio中构建和设计类似的引导页。 在这个源码中,开发者...

    安卓开发-Android应用源码高仿墨迹天气引导界面.zip

    本资源“安卓开发-Android应用源码高仿墨迹天气引导界面.zip”提供了一套完整的源码,用于实现类似墨迹天气应用的引导页效果。这个项目不仅适用于初学者学习Android UI设计,也对有经验的开发者有参考价值,可以快速...

    安卓Android源码——引导界面仿人人网.zip

    该压缩包文件“安卓Android源码——引导界面仿人人网.zip”主要包含了创建一个类似人人网的安卓应用启动引导界面的源代码。引导界面在移动应用中通常用于首次启动时展示,向用户介绍应用的主要功能或特性,提升用户...

    安卓欢迎界面引导页面viewpager相关-SCViewPager.rar

    当标志存在时,应用可以直接跳过引导页面进入主界面。 8. **自调适和兼容性**: "程序如果跑不起来需要自调"提示开发者,SCViewPager可能需要根据具体设备和系统版本进行适配和调试。Android平台具有广泛的设备和...

    安卓欢迎界面引导页面viewpager相关-Uber的欢迎界面.zip

    本资源“安卓欢迎界面引导页面viewpager相关-Uber的欢迎界面.zip”提供了Uber应用的欢迎界面实现,采用ViewPager作为核心组件。ViewPager是一个强大的视图切换工具,常用于在多个页面间滑动浏览,非常适合构建欢迎...

    android应用源码仿微信用户引导页源码.zip

    "android应用源码仿微信用户引导页源码.zip" 提供了一个Android实例应用,用于帮助开发者理解和实现类似微信的用户引导页效果。 首先,我们要理解引导页的基本结构。一个简单的引导页通常包含几帧静态或动态图片,...

    Android app新手引导,任意View高亮提示,简单易用

    在Android应用开发中,新手引导和视图高亮提示是提升用户体验的重要手段,尤其是在初次使用应用时,能够帮助用户快速理解和熟悉应用的功能布局。本文将详细介绍如何在Android平台上实现这样的功能,让开发者能够轻松...

    Android引导页+源代码工程

    - **启动逻辑**:在MainActivity或者Application中控制引导页的显示和跳转到主界面的时机。 4. **自定义引导页** - **自定义动画**:除了使用系统提供的PageTransformer,还可以通过自定义ViewGroup或组合多个...

    引导页Demo

    如果没有,就显示引导页,否则直接跳转到主界面。引导页完成后,更新SharedPreferences状态。 6. **动画和交互**:为了让引导页更吸引人,可以添加过渡动画和触摸反馈。例如,可以使用`ObjectAnimator`或自定义`...

    Android程序初始化界面

    在Android应用开发中,创建一个吸引用户的初始化界面(也称为启动屏幕或引导页面)是非常常见的做法,这可以增强用户体验并展示应用的品牌形象。本项目利用ViewPager实现了一个Android程序安装后的开场界面,它允许...

    android应用源码仿微信用户引导页源码.zip源码资源下载

    此外,引导页通常还包括一个“开始使用”或“跳过”按钮,这可以通过`Button`控件实现,设置相应的点击事件来启动应用主界面或跳过引导页。 在实现过程中,Android的布局文件(XML)会定义每个引导页的视图结构,...

    ViewPager引导页

    7. **逻辑控制**:最后,需要在主界面的入口处检查用户是否需要看到引导页,如果需要,则显示ViewPager引导页;否则直接进入主界面。 在实现过程中,可能还会遇到一些问题,例如页面滑动速度的控制、页面间的过渡...

    ViewPager例子

    3. **首次启动引导界面** 首次启动应用时,许多应用会展示一个引导页面序列,帮助用户了解应用的主要功能。在这个例子中,当应用第一次启动时,会显示引导界面。这通常通过在启动时检查SharedPreferences等持久化...

Global site tag (gtag.js) - Google Analytics