Android仿Launcher效果
来源:互联网 发布:如何ringerlink数据库 编辑:程序博客网 时间:2024/04/30 02:31
效果1
效果2
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.cn.npass.nj" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".MainActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
scroll_main.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/myView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" > <com.cn.npass.nj.ScrollViewGroup android:id="@+id/scrollViewGroup" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <com.cn.npass.nj.PageControlView android:id="@+id/pageControl" android:layout_width="fill_parent" android:layout_height="80px" android:layout_alignParentBottom="true" android:background="#8f00000f" android:gravity="center" /></RelativeLayout>
scroll_layout_0.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="请输入姓名:" /> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="提交" /></LinearLayout>
MainActivity.java
package com.cn.npass.nj;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.ImageView;/** */public class MainActivity extends Activity {@SuppressWarnings("unused")private static final String TAG = "scroller";private ScrollViewGroup viewGroup;private PageControlView pageControl;private int[] argImages = {R.drawable.a1,R.drawable.a2,R.drawable.a3,R.drawable.a4};@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.scroll_main);viewGroup = (ScrollViewGroup) findViewById(R.id.scrollViewGroup);ImageView imageView = new ImageView(this);imageView.setImageDrawable(getResources().getDrawable(R.drawable.a1));viewGroup.addView(imageView);viewGroup.addView(View.inflate(this, R.layout.scroll_layout_0, null));imageView = new ImageView(this);imageView.setImageDrawable(getResources().getDrawable(R.drawable.a1));viewGroup.addView(imageView);imageView = new ImageView(this);imageView.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher));viewGroup.addView(imageView);for (int i = 0; i < argImages.length; i++) {imageView = new ImageView(this);imageView.setImageDrawable(getResources().getDrawable(argImages[i]));viewGroup.addView(imageView);}// 设置图片填充ImageView//imageView.setScaleType(ScaleType.CENTER);viewGroup.setCurrentScreenIndex(0);pageControl = (PageControlView) findViewById(R.id.pageControl);pageControl.bindScrollViewGroup(viewGroup);}}
PageControlView.java
package com.cn.npass.nj;import android.content.Context;import android.util.AttributeSet;import android.widget.ImageView;import android.widget.LinearLayout;import com.cn.npass.nj.ScrollViewGroup.OnScreenChangeListener;/** */public class PageControlView extends LinearLayout {private Context context;private int count;public void bindScrollViewGroup(ScrollViewGroup scrollViewGroup) {this.count = scrollViewGroup.getChildCount();generatePageControl(scrollViewGroup.getCurrentScreenIndex());scrollViewGroup.setOnScreenChangeListener(new OnScreenChangeListener() {@Overridepublic void onScreenChange(int currentIndex) {generatePageControl(currentIndex);}});}public PageControlView(Context context) {super(context);this.init(context);}public PageControlView(Context context, AttributeSet attrs) {super(context, attrs);this.init(context);}private void init(Context context) {this.context = context;}private void generatePageControl(int currentIndex) {this.removeAllViews();for (int i = 0; i < this.count; i++) {ImageView imageView = new ImageView(context);if (currentIndex == i) {imageView.setImageResource(R.drawable.page_indicator_focused);} else {imageView.setImageResource(R.drawable.page_indicator);}this.addView(imageView);}}}
ScrollViewGroup.java
package com.cn.npass.nj;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.GestureDetector;import android.view.GestureDetector.OnGestureListener;import android.view.MotionEvent;import android.view.View;import android.view.ViewConfiguration;import android.view.ViewGroup;import android.widget.Scroller;/** */public class ScrollViewGroup extends ViewGroup {private static final String TAG = "scroller";private Scroller scroller;private int currentScreenIndex;//当前屏的索引public int getCurrentScreenIndex() {return currentScreenIndex;}public void setCurrentScreenIndex(int currentScreenIndex) {this.currentScreenIndex = currentScreenIndex;}private GestureDetector gestureDetector;// 设置一个标志位,防止底层的onTouch事件重复处理UP事件private boolean fling;public ScrollViewGroup(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initView(context);}public ScrollViewGroup(Context context, AttributeSet attrs) {super(context, attrs);initView(context);}public ScrollViewGroup(Context context) {super(context);initView(context);}private void initView(final Context context) {this.scroller = new Scroller(context);this.gestureDetector = new GestureDetector(new OnGestureListener() {@Overridepublic boolean onSingleTapUp(MotionEvent e) {return false;}@Overridepublic void onShowPress(MotionEvent e) {}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {if ((distanceX > 0 && currentScreenIndex < getChildCount() - 1)// 防止移动过最后一页|| (distanceX < 0 && getScrollX() > 0)) {// 防止向第一页之前移动scrollBy((int) distanceX, 0);}return true;}@Overridepublic void onLongPress(MotionEvent e) {}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2,float velocityX, float velocityY) {Log.d(TAG, "min velocity >>>"+ ViewConfiguration.get(context).getScaledMinimumFlingVelocity()+ " current velocity>>" + velocityX);// 判断是否达到最小轻松速度,取绝对值的if (Math.abs(velocityX) > ViewConfiguration.get(context).getScaledMinimumFlingVelocity()) {if (velocityX > 0 && currentScreenIndex > 0) {// 手指从左往右划Log.d(TAG, ">>>>fling to left");fling = true;scrollToScreen(currentScreenIndex - 1);} else if (velocityX < 0&& currentScreenIndex < getChildCount() - 1) {Log.d(TAG, ">>>>fling to right");fling = true;scrollToScreen(currentScreenIndex + 1);}}return true;}@Overridepublic boolean onDown(MotionEvent e) {return false;}});}@Overrideprotected void onLayout(boolean changed, int left, int top, int right,int bottom) {Log.d(TAG, ">>left: " + left + " top: " + top + " right: " + right+ " bottom:" + bottom);/** * 设置布局,将子视图顺序横屏排列 */for (int i = 0; i < getChildCount(); i++) {View child = getChildAt(i);child.setVisibility(View.VISIBLE);child.measure(right - left, bottom - top);child.layout(0 + i * getWidth(), 0, getWidth() + i * getWidth(),getHeight());}// 初始化显示第几个界面int delta = currentScreenIndex * getWidth() - getScrollX();scroller.startScroll(getScrollX(), 0, delta, 0, 0);invalidate();}@Overridepublic void computeScroll() {if (scroller.computeScrollOffset()) {scrollTo(scroller.getCurrX(), 0);postInvalidate();}}@Overridepublic boolean onTouchEvent(MotionEvent event) {gestureDetector.onTouchEvent(event);switch (event.getAction()) {case MotionEvent.ACTION_DOWN:break;case MotionEvent.ACTION_MOVE:break;case MotionEvent.ACTION_UP:if (!fling) {snapToDestination();}fling = false;break;default:break;}return true;}/** * 切换到指定屏 * * @param whichScreen */private void scrollToScreen(int whichScreen) {if (getFocusedChild() != null && whichScreen != currentScreenIndex&& getFocusedChild() == getChildAt(currentScreenIndex)) {getFocusedChild().clearFocus();}final int delta = whichScreen * getWidth() - getScrollX();scroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 2);invalidate();currentScreenIndex = whichScreen;if (onScreenChangeListener != null) {onScreenChangeListener.onScreenChange(currentScreenIndex);}}/** * 根据当前x坐标位置确定切换到第几屏 */private void snapToDestination() {scrollToScreen((getScrollX() + (getWidth() / 2)) / getWidth());}public interface OnScreenChangeListener {void onScreenChange(int currentIndex);}private OnScreenChangeListener onScreenChangeListener;public void setOnScreenChangeListener(OnScreenChangeListener onScreenChangeListener) {this.onScreenChangeListener = onScreenChangeListener;}}
资源下载地址为:http://download.csdn.net/detail/niejing654092427/4500937
- Android仿Launcher效果
- 仿android系统Launcher界面
- Android-使用ViewPager实现高仿launcher拖动效果(转)
- android Launcher 自定义View 高仿hola一键清理效果
- Android开发之ViewPager实现多页面切换及动画效果(仿Android的Launcher效果)
- Android: 仿Launcher Workspace左右滑动控件
- 高仿launcher和墨迹左右拖动效果
- 使用ViewPager实现高仿launcher拖动效果
- 高仿launcher和墨迹左右拖动效果
- 高仿launcher和墨迹左右拖动效果
- 使用ViewPager实现高仿Launcher的拖动效果
- 使用ViewPager实现高仿launcher拖动效果
- 使用ViewPager实现高仿launcher拖动效果
- 高仿launcher和墨迹左右拖动效果
- 使用ViewPager实现高仿launcher拖动效果
- 高仿launcher和墨迹左右拖动效果
- 高仿launcher和墨迹左右拖动效果
- 使用ViewPager实现高仿launcher拖动效果
- Reporting Service 2005到2008升级测试
- Cocoa框架类之间继承关系
- 让IE支持HTML5
- Boyer-Moore算法学习
- linux 下去掉^M
- Android仿Launcher效果
- ubuntu更新(安装)软件卡死解决方案
- pthread_create传递参数/单个或者多个
- Show 与 ShowModal 区别
- C# API 大全
- linux下字体乱码问题的解决
- 禁用VS2010的IntelliSense
- 在VS2010开发环境中CString 和char转换
- HDU Electrical Outlets