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