package com.chen.weixin.test;
import android.R.bool;
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.ViewConfiguration;
import android.view.ViewGroup;
import android.view.View.MeasureSpec;
import android.widget.Scroller;
public class MyScrollLayout extends ViewGroup{
private static final String TAG = "ScrollLayout";
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 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);
// 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
Log.e(TAG, "snap left");
snapToScreen(mCurScreen - 1);
} else if (velocityX < -SNAP_VELOCITY
&& mCurScreen < getChildCount() - 1) {
// Fling enough to move right
Log.e(TAG, "snap right");
snapToScreen(mCurScreen + 1);
} else {
snapToDestination();
}
if (mVelocityTracker != null) {
mVelocityTracker.recycle();
mVelocityTracker = null;
}
// mTouchState = TOUCH_STATE_REST;
break;
}
return true;
}
//
// public boolean onInterceptTouchEvent(MotionEvent ev) {
// // TODO Auto-generated method stub
// final int action = ev.getAction();
// if ((action == MotionEvent.ACTION_MOVE)
// && (mTouchState != TOUCH_STATE_REST)) {
// Log.i("", "onInterceptTouchEvent return true");
// return true;
// }
// final float x = ev.getX();
// final float y = ev.getY();
// switch (action) {
// case MotionEvent.ACTION_MOVE:
// final int xDiff = (int) Math.abs(mLastMotionX - x);
// if (xDiff > mTouchSlop) {
// mTouchState = TOUCH_STATE_SCROLLING;
// }
// break;
//
// case MotionEvent.ACTION_DOWN:
// mLastMotionX = x;
//
android欢迎界面源代码

在Android应用开发中,欢迎界面(Splash Screen)是用户打开应用时首先看到的页面,它通常展示品牌标识、应用图标或者加载进度,为用户提供一种视觉上的欢迎体验。本资源提供了模仿微信欢迎界面的源代码,这将是一个很好的起点,帮助开发者创建自己的Android欢迎界面。
在Android中,欢迎界面的实现主要有两种方式:静态图片展示和动态加载。静态图片展示是最简单的,只需设置一个ImageView显示预设的欢迎图片;而动态加载则可能涉及到一些动画效果,如渐变、滑动等,以增加用户体验的丰富性。
这份"TestWeiXinWhatsNew"源代码很可能是实现了一个动态加载的欢迎界面,其设计可能包含以下关键部分:
1. **Activity定义**:你需要创建一个新的Activity,这个Activity将作为欢迎界面的入口。在AndroidManifest.xml中注册这个Activity,并设置为主启动Activity。
2. **布局设计**:在res/layout目录下,编写XML布局文件,定义欢迎界面的UI元素。这些元素可能包括应用的Logo、背景图片以及可能的加载指示器。
3. **动画效果**:为了达到微信欢迎界面的效果,可能会用到Android的动画库。这可能涉及到Alpha(透明度)、Scale(缩放)、Translation(平移)等动画类型,以实现图片或文字的淡入淡出、放大缩小等效果。
4. **延迟跳转**:为了让用户有足够的时间查看欢迎界面,通常会设置一个延时跳转到主应用界面。可以使用Handler或CountDownTimer来控制这一过程。
5. **启动优化**:在实际应用中,为了减少启动时间,开发者可能会考虑异步加载资源,或者预加载一部分数据,以提供更流畅的用户体验。
6. **权限检查**:如果欢迎界面需要额外的权限,如网络访问,那么需要在适当的地方添加权限检查,并处理用户拒绝权限的情况。
7. **过渡效果**:从欢迎界面到主应用界面的过渡也可以通过动画来实现,让用户体验更加平滑。
通过研究和理解这份"TestWeiXinWhatsNew"源代码,开发者可以学习到如何创建一个具有专业感和流畅体验的Android欢迎界面,同时也可以借鉴其中的设计思路,根据自己的需求进行定制和扩展。在实际项目中,欢迎界面的设计和实现是一个需要综合考虑用户体验、性能优化和品牌展示的重要环节。

狂野小青年
- 粉丝: 8823
最新资源
- 通识课改革立项申请-走近电子商务.doc
- 校企合作共建高职计算机应用技术专业模式探索.docx
- 电力系统自动化课程综述.doc
- 人工智能结课作业(A星八数码/广度优先/深度优先/粒子群寻优算法/遗传算法/蚁群算法/BP神经网络/卷积神经网络)
- 《单片机的温度控制系统的设计》.doc
- 计算机信息技术发展方向及其应用分析.docx
- 网络交易安全与民商法保护的相关性分析.docx
- 计算机维修检测平台使用说明.ppt
- 单片机交通控制灯的方案设计书与实现14543.doc
- 中间件技术全解析:从基础到应用实践
- 三相异步电动机Matlab仿真.doc
- 新闻网站方案设计书正文39891.doc
- 学校网站建设与应用研究的工作报告.doc
- 大数据时代企业财务战略管理问题的探讨.docx
- 封小云ITK和VTK医学图像处理系统设计方案与实现.doc
- 现代项目管理——绪论.doc
- 1
- 2
- 3
- 4
前往页