2013-11-29 35 views
0

如果您使用Google Plus Android應用程序,您會注意到在不同評論之間不斷旋轉的評論源。類似實施贊成谷歌加評論

下面是它的截圖:

Google Plus Android App

有沒有人對如何實施類似的做法任何想法?我沒有要求任何代碼,但希望瞭解如何實現這一點的基本想法。

請使用谷歌加Android應用程序,並檢查評論在帖子上的行爲。你會知道我在問什麼。

+0

請,更明確。 「保持旋轉」是什麼意思? while(true){rotate()} ?? – Snicolas

+1

@Snicolas好吧,如果真的那麼簡單 - >'While(true){rotate()}'我不會在這裏提出一個問題。請使用Google Plus Android應用並檢查帖子上評論的行爲。你會知道我在問什麼。 – JoelFernandes

回答

1

我懷疑這是類似於這樣一個自定義View,請記住從XML手動調節寬度和高度:

import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.os.Handler; 
import android.util.AttributeSet; 
import android.view.View; 

public class RotatingView extends View { 

public static class RotatingData { 
    String data; 

    public RotatingData(String data) { 
     super(); 
     this.data = data; 
    } 
} 

public interface OnItemRotatedListener { 
    public void onItemRotated(RotatingData data); 
} 

private List<RotatingData> mList; 
private Paint mPaint; 
private Handler mHandler; 
private int mCurrentSelection; 
private OnItemRotatedListener mItemRotatedListener; 
private Random mRandom; 

public RotatingView(Context context) { 
    this(context, null); 
} 

public RotatingView(Context context, AttributeSet attrs) { 
    this(context, attrs, 0); 
} 

public RotatingView(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    mPaint = new Paint(); 
    mHandler = new Handler(); 
    mRandom = new Random(); 
    List<RotatingData> list = new ArrayList<RotatingView.RotatingData>(); 
    list.add(new RotatingData("0th item selected")); 
    list.add(new RotatingData("1st item selected")); 
    list.add(new RotatingData("2nd item selected")); 
    setRotatingData(list); 
    setSelection(0); 
} 

private void setSelection(int i) { 
    mCurrentSelection = i; 
    invokeListener(mList.get(i)); 
    invalidate(); 
} 

public void setRotatingData(List<RotatingData> list) { 
    mList = list; 
    invalidate(); 
} 

public OnItemRotatedListener getItemRotatedListener() { 
    return mItemRotatedListener; 
} 

public void setItemRotatedListener(OnItemRotatedListener itemRotatedListener) { 
    mItemRotatedListener = itemRotatedListener; 
    invokeListener(mList.get(mCurrentSelection)); 
} 

private void invokeListener(RotatingData data) { 
    if (mItemRotatedListener != null) { 
     mItemRotatedListener.onItemRotated(data); 
    } 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    final List<RotatingData> list = mList; 
    final int count = list.size(); 
    final float w = getMeasuredWidth()/(float) count; 
    final int h = getMeasuredHeight(); 
    int left = 0; 
    final Paint paint = mPaint; 
    for (int i = 0; i < list.size(); i++) { 
     if (i == mCurrentSelection) { 
      paint.setColor(Color.DKGRAY); 
     } else { 
      paint.setColor(Color.LTGRAY); 
     } 
     canvas.drawRect(left, 0, left + w, h, paint); 
     left += w; 
    } 
} 

@Override 
protected void onAttachedToWindow() { 
    super.onAttachedToWindow(); 
    startRotating(); 
} 

private void startRotating() { 
    mHandler.postDelayed(new Runnable() { 

     @Override 
     public void run() { 
      mCurrentSelection++; 
      mCurrentSelection %= mList.size(); 
      setSelection(mCurrentSelection); 
      mHandler.postDelayed(this, mRandom.nextInt(1000) + 1000); 
     } 
    }, mRandom.nextInt(1000) + 1000); 
} 

@Override 
protected void onDetachedFromWindow() { 
    super.onDetachedFromWindow(); 
    stopRotating(); 
} 

private void stopRotating() { 
    mHandler.removeCallbacksAndMessages(null); 
} 
} 
+0

謝謝。將嘗試它 – JoelFernandes