2012-09-19 54 views
2

之間平滑滾動我有這樣的代碼了兩個ImageViews之間ViewFlipper動畫,二ImageViews

public class CaseHolder extends MainClass{ 

// for the next movement 
public static Animation inFromLeftAnimation() { 
    Animation inFromLeft = new TranslateAnimation(
      Animation.RELATIVE_TO_PARENT, -1.0f, 
      Animation.RELATIVE_TO_PARENT, 0.0f, 
      Animation.RELATIVE_TO_PARENT, 0.0f, 
      Animation.RELATIVE_TO_PARENT, 0.0f); 
    inFromLeft.setDuration(350); 
    inFromLeft.setInterpolator(new AccelerateInterpolator()); 
    return inFromLeft; 
} 
// for the previous movement 
public static Animation inFromRightAnimation() { 

    Animation inFromRight = new TranslateAnimation(
      Animation.RELATIVE_TO_PARENT, +1.0f, 
      Animation.RELATIVE_TO_PARENT, 0.0f, 
      Animation.RELATIVE_TO_PARENT, 0.0f, 
      Animation.RELATIVE_TO_PARENT, 0.0f); 
    inFromRight.setDuration(350); 
    inFromRight.setInterpolator(new AccelerateInterpolator()); 
    return inFromRight; 
} 
public static Animation outToLeftAnimation() { 
    Animation outtoLeft = new TranslateAnimation(
      Animation.RELATIVE_TO_PARENT, 0.0f, 
      Animation.RELATIVE_TO_PARENT, -1.0f, 
      Animation.RELATIVE_TO_PARENT, 0.0f, 
      Animation.RELATIVE_TO_PARENT, 0.0f); 
    outtoLeft.setDuration(350); 
    outtoLeft.setInterpolator(new AccelerateInterpolator()); 
    return outtoLeft; 
} 
public static Animation outToRightAnimation() { 
    Animation outtoRight = new TranslateAnimation(
      Animation.RELATIVE_TO_PARENT, 0.0f, 
      Animation.RELATIVE_TO_PARENT, +1.0f, 
      Animation.RELATIVE_TO_PARENT, 0.0f, 
      Animation.RELATIVE_TO_PARENT, 0.0f); 
    outtoRight.setDuration(350); 
    outtoRight.setInterpolator(new AccelerateInterpolator()); 
    return outtoRight; 
} 
TextView pcn; 

TextView header; 
TextView date; 
ImageView right; 
TextView status; 

ImageView left; 
String dateFromIntent; 

String pcnFromIntent; 

String statusFromIntent; 

ViewFlipper vf; 

float oldTouchValue; 

boolean isDown; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    super.setTabBar(R.layout.caseholder); 
    overridePendingTransition(R.anim.activityfade, R.anim.activityfadeout); 

    vf = (ViewFlipper) findViewById(R.id.viewFlipper01); 


    pcn = (TextView) findViewById(R.id.pcn); 
    header = (TextView) findViewById(R.id.textView1); 
    date = (TextView) findViewById(R.id.date); 
    status = (TextView) findViewById(R.id.status); 

    right = (ImageView) findViewById(R.id.rightF); 
    left = (ImageView) findViewById(R.id.leftF); 

    header.setText("Overview"); 
    pcnFromIntent = getIntent().getExtras().getString("pcn"); 
    dateFromIntent = getIntent().getExtras().getString("date"); 
    statusFromIntent = getIntent().getExtras().getString("status"); 

    date.setText("Date: " + dateFromIntent); 
    pcn.setText(pcnFromIntent); 
    status.setText("Status: " + statusFromIntent); 

    if (getIntent().hasExtra("right")) { 
     Bitmap b = BitmapFactory.decodeByteArray(getIntent() 
       .getByteArrayExtra("right"), 0, getIntent() 
       .getByteArrayExtra("right").length); 
     right.setImageBitmap(b); 
    } 

    if (getIntent().hasExtra("left")) { 
     Bitmap b1 = BitmapFactory.decodeByteArray(getIntent() 
       .getByteArrayExtra("left"), 0, getIntent() 
       .getByteArrayExtra("left").length); 

     left.setImageBitmap(b1); 
    } 

} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     Intent j = new Intent(getApplicationContext(), MainClass.class); 
     startActivity(j); 
      CaseHolder.this.finish(); 
      overridePendingTransition(R.anim.activityfade, R.anim.activityfadeout); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

@Override 
public boolean onTouchEvent(MotionEvent touchevent) { 

    switch (touchevent.getAction()) { 
    case MotionEvent.ACTION_DOWN: { 
     oldTouchValue = touchevent.getX(); 
     break; 
    } 
    case MotionEvent.ACTION_UP: { 

     float currentX = touchevent.getX(); 
     if (oldTouchValue < currentX) { 
      vf.setInAnimation(inFromLeftAnimation()); 
      vf.setOutAnimation(outToRightAnimation()); 
      vf.showNext(); 

     } 
     if (oldTouchValue > currentX) { 
      vf.setInAnimation(inFromRightAnimation()); 
      vf.setOutAnimation(outToLeftAnimation()); 
      vf.showPrevious(); 
     } 
     break; 
    } 
    } 
    return false; 
} 

}

這工作完全以良好的滑動,但我希望有一個平滑的滾動。現在,用戶必須從屏幕上擡起他的手指,才能在Views之間滑動。我如何修改此代碼,以便用戶可以在屏幕上滑動手指,並且ViewFlipper將「跟隨」手指移動?

+1

有你的U之前sed一個ViewPager?它是Android兼容性庫的一部分,完全符合您的要求,並得到Google的支持。 http://developer.android.com/reference/android/support/v4/view/ViewPager.html – MCeley

+0

我還沒有看過它,但我會。謝謝! –

回答

3

只需實現android.support.v4.view.ViewPager,它的適配器, 非常容易。 這是適配器類的代碼。 您只需將視圖添加到adapter並將ViewPager的適配器設置爲此。

public class PreferencesViewPagerAdapter extends PagerAdapter 
{ 
    ArrayList<View> preferencesViews; 

public PreferencesViewPagerAdapter(ArrayList<View> preferencesViews) 
{ 
    this.preferencesViews = preferencesViews; 
} 

@Override 
public Object instantiateItem(ViewGroup container, int position) 
{ 
    ((ViewPager) container).addView(preferencesViews.get(position)); 
    return preferencesViews.get(position); 
} 

@Override 
public int getCount() 
{ 
    return preferencesViews.size(); 
} 

@Override 
public boolean isViewFromObject(View view, Object object) 
{ 
    return view == object; 
} 

@Override 
public void destroyItem(ViewGroup container, int position, Object view) 
{ 
    ((ViewPager) container).removeView((View) view); 
} 

}

1

我怎麼能修改此代碼,以便用戶可以在屏幕

我就從鞦韆找個地方MouseDragListener的等效手指滑動。或許有人會告訴你哪個是事件名稱(也許MotionEvent. ACTION_MOVE)。無論如何,這個想法是讓你的活動有這個回調,當你有x1,y1,x2,y2座標時更容易「跟隨」