Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android開發中一個模仿launcher的實例

Android開發中一個模仿launcher的實例

編輯:Android開發實例

  Android開發中做一個模仿launcher的效果,看看運行後的效果:


  首先自定義一個 ViewGroup:

  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;

  }

  }

  

  public class SwitchViewDemoActivity extends Activity implements OnViewChangeListener, OnClickListener{

  /** Called when the activity is first created. */

  private MyScrollLayout mScrollLayout;

  private ImageView[] mImageViews;

  private int mViewCount;

  private int mCurSel;

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.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.guide01);

  mScrollLayout.addView(layout);

  //動態添加一個imageView控件

  ImageView imageView=new ImageView(this);

  imageView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

  imageView.setPadding(15, 15, 15, 15);

  imageView.setImageResource(R.drawable.guide_round);

  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].setEnabled(true);

  mImageViews[index].setEnabled(false);

  mCurSel = index;

  }

  @Override

  public void OnViewChange(int view) {

  // TODO Auto-generated method stub

  setCurPoint(view);

  }

  @Override

  public void onClick(View v) {

  // TODO Auto-generated method stub

  int pos = (Integer)(v.getTag());

  setCurPoint(pos);

  mScrollLayout.snapToScreen(pos);

  }

  }

  最後是布局文件 :

  <?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" >

  <cn.com.karl.scroll.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/guide01" >

  </LinearLayout>

  <LinearLayout

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  android:background="@drawable/guide02" >

  </LinearLayout>

  <LinearLayout

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  android:background="@drawable/guide03" >

  </LinearLayout>

  <LinearLayout

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  android:background="@drawable/guide04" >

  </LinearLayout>

  <LinearLayout

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  android:background="@drawable/guide05" >

  </LinearLayout>

  </cn.com.karl.scroll.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/guide_round" />

  <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/guide_round" />

  <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/guide_round" />

  <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/guide_round" />

  <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/guide_round" />

  </LinearLayout>

  </RelativeLayout>

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved