Android:查看寻呼机水平滚动不流畅

时间:2012-06-20 05:23:09

标签: android android-viewpager indicator

我正在使用查看寻呼机指示器,我已经成功实施了它,但我的问题是我的滑动非常慢。对此有任何帮助将不胜感激。

我的指标活动:

public class ViewPagerIndicatorActivity extends FragmentActivity {
static PagerAdapter mPagerAdapter;
static ViewPager  mViewPager;
static ViewPagerIndicator mIndicator;

static int position,position1;
static String PositionTitle;
static String addposition;
ProgressDialog dialog;
public Context _context=this;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Create our custom adapter to supply pages to the viewpager.
try{


    mPagerAdapter = new PagerAdapter(getSupportFragmentManager());
    mViewPager = (ViewPager)findViewById(R.id.pager);
    mViewPager.setAdapter(mPagerAdapter);
    // Start at a custom position
    RelativeLayout firsthead=(RelativeLayout)findViewById(R.id.firsthead);
    firsthead.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent ii=new Intent(getApplicationContext(),WebviewNew.class);
            startActivity(ii);
        }
    });

    mViewPager.setCurrentItem(0);

    mIndicator = (ViewPagerIndicator)findViewById(R.id.indicator);

    mViewPager.setOnPageChangeListener(mIndicator);


}catch (Exception e) {
    // TODO: handle exception
    System.out.println(e);
}
}

@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
     mViewPager.setAdapter(null);
    super.onDestroy();
}

class OnIndicatorClickListener implements ViewPagerIndicator.OnClickListener{
    @Override
    public void onCurrentClicked(View v) {
        Toast.makeText(ViewPagerIndicatorActivity.this, "Hello", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onNextClicked(View v) {
        mViewPager.setCurrentItem(Math.min(mPagerAdapter.getCount() - 1, mIndicator.getCurrentPosition() + 1));
    }

    @Override
    public void onPreviousClicked(View v) {
        mViewPager.setCurrentItem(Math.max(0, mIndicator.getCurrentPosition() - 1));
    }

}

class PagerAdapter extends FragmentPagerAdapter implements ViewPagerIndicator.PageInfoProvider{

    public PagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int pos) {
        Fragment f = new Fragment();
        if(pos==0)
        {
            f=LayoutOne.newInstance(_context);
        }
        if(pos==1)
        {
            f=LayoutTwo.newInstance(_context);  
        }
        if(pos==2)
        {
            f=Layoutthree.newInstance(_context);

        }
        if(pos==3)
        {
            f=Layoutfour.newInstance(_context); 
        }

    return f;
    }

    @Override
    public int getCount() {
        return list2.length;
    }

    @Override
    public String getTitle(int pos){

        PositionTitle=list2[pos];

        return PositionTitle;   
    }   
}

public static class ItemFragment extends ListFragment{

    String[] l1;

    static ItemFragment newInstance1(String[] date) {
        ItemFragment f = new ItemFragment();

        // Supply num input as an argument.
        Bundle args = new Bundle();

        args.putStringArray("date", date);
        f.setArguments(args);

        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            this.l1=list2;

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
       View v = inflater.inflate(R.layout.date_fragment, container, false);

         return v;
    }

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

    }



}

public static final String[] list2 = new String[]{"Catagories","Latest","Most Downloaded","Top Rated"};

private class StartTaskP extends AsyncTask<String, String, String>
{

    @Override
    protected void onPreExecute()
    {
        // TODO Auto-generated method stub
        super.onPreExecute();
         dialog = ProgressDialog.show(ViewPagerIndicatorActivity.this, "Please wait", "Loading...");
    }

    @Override
    protected String doInBackground(String... params)
    {
        String hello = null;
        try
        {} catch (Exception e)
        {
            e.printStackTrace();
        }
  return hello;
    }

    @Override
    protected void onPostExecute(String result)
    {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        try{
            mIndicator.init(0, mPagerAdapter.getCount(), mPagerAdapter);
            Resources res = getResources();
            System.out.println("test11");
            Drawable prev = res.getDrawable(R.drawable.indicator_prev_arrow);
            Drawable next = res.getDrawable(R.drawable.indicator_next_arrow);
            mIndicator.setFocusedTextColor(new int[]{78, 103, 0});
            mIndicator.setUnfocusedTextColor(new int[]{255,255,255});
            //mIndicator.setFocusedTextColor(R.drawable.navigationtextcurrent);

            // Set images for previous and next arrows.
            mIndicator.setArrows(prev, next);

            mIndicator.setOnClickListener(new OnIndicatorClickListener());  
        }

        catch (Exception e) {
        // TODO: handle exception
        System.out.println(e);
    }
        dialog.dismiss();
    }
}

和我的ViewPagerIndicator:

public class ViewPagerIndicator extends RelativeLayout implements OnPageChangeListener {
private static final int PADDING = 10;
int i=0;
TextView mPrevious;
TextView mCurrent;
TextView mNext;
static int mCurItem;
int mRestoreCurItem = -1;

Intent ii= new Intent();
Context mContext;

static int PresentPosition1;

static String textCarrier;


LinearLayout mPreviousGroup;
LinearLayout mNextGroup;

int mArrowPadding;
int mSize;

ImageView mCurrentIndicator;
ImageView mPrevArrow;
ImageView mNextArrow;

 static PageInfoProvider mPageInfoProvider;

int[] mFocusedTextColor;
int[] mUnfocusedTextColor;

OnClickListener mOnClickHandler;

public interface PageInfoProvider{
    String getTitle(int pos);

}

public interface OnClickListener{
    void onNextClicked(View v);
    void onPreviousClicked(View v);
    void onCurrentClicked(View v);
}

public void setOnClickListener(OnClickListener handler){
    this.mOnClickHandler = handler;
    mPreviousGroup.setOnClickListener(new OnPreviousClickedListener());
    mCurrent.setOnClickListener(new OnCurrentClickedListener());
    mNextGroup.setOnClickListener(new OnNextClickedListener());
}

public int getCurrentPosition(){
    return mCurItem;
}


public void setPageInfoProvider(PageInfoProvider pageInfoProvider){
    this.mPageInfoProvider = pageInfoProvider;
}

public void setFocusedTextColor(int[] col){
    System.arraycopy(col, 0, mFocusedTextColor, 0, 3);
    updateColor(0);
}

public void setUnfocusedTextColor(int[] col){
    System.arraycopy(col, 0, mUnfocusedTextColor, 0, 3);
    mNext.setTextColor(Color.argb(160, col[0], col[1], col[2]));
    mPrevious.setTextColor(Color.argb(160, col[0], col[1], col[2]));
    updateColor(0);
}

@Override
protected Parcelable onSaveInstanceState() {
    Parcelable state = super.onSaveInstanceState();
    Bundle b = new Bundle();
    b.putInt("current", this.mCurItem);
    b.putParcelable("viewstate", state);
    return b;
}

@Override
protected void onRestoreInstanceState(Parcelable state) {
    super.onRestoreInstanceState(((Bundle)state).getParcelable("viewstate"));
    mCurItem = ((Bundle)state).getInt("current", mCurItem);
    this.setText(mCurItem - 1);
    this.updateArrows(mCurItem);
    this.invalidate();
}

/**
 * Initialization
 * 
 * @param startPos The initially selected element in the ViewPager
 * @param size Total amount of elements in the ViewPager
 * @param pageInfoProvider Interface that returns page titles
 */
public void init(int startPos, int size, PageInfoProvider pageInfoProvider){
    setPageInfoProvider(pageInfoProvider);
    this.mSize = size;
    setText(startPos - 1);
    mCurItem = startPos;
}

public ViewPagerIndicator(Context context, AttributeSet attrs) {
    super(context, attrs);
    addContent();
}

public ViewPagerIndicator(Context context, AttributeSet attrs, int defStyle){
    super(context, attrs, defStyle);
    addContent();
}

public ViewPagerIndicator(Context context) {
    super(context);
    addContent();
}

/**
 * Add drawables for arrows
 * 
 * @param prev Left pointing arrow
 * @param next Right pointing arrow
 */
public void setArrows(Drawable prev, Drawable next){
    this.mPrevArrow = new ImageView(getContext());
    //this.mPrevArrow.setImageDrawable(prev);
    this.mPrevArrow.setVisibility(View.INVISIBLE);

    this.mNextArrow = new ImageView(getContext());
    //this.mNextArrow.setImageDrawable(next);

    LinearLayout.LayoutParams arrowLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    //arrowLayoutParams.gravity = Gravity.CENTER;


    mPreviousGroup.removeAllViews();
    mPreviousGroup.addView(mPrevArrow, arrowLayoutParams);
    mPreviousGroup.addView(mPrevious, arrowLayoutParams);

    mPrevious.setPadding(PADDING, 0, 0, 0);
    mNext.setPadding(0, 0, PADDING, 0);

    mArrowPadding = PADDING + prev.getIntrinsicWidth();

    mNextGroup.addView(mNextArrow, arrowLayoutParams);
    updateArrows(mCurItem);
}

/**
 * Create all views, build the layout
 */
private void addContent(){
    mFocusedTextColor = new int[]{244, 240, 211};
    mUnfocusedTextColor = new int[]{160,131,21};

    // Text views

    // set font

    mPrevious = new TextView(getContext());
    mCurrent = new TextView(getContext());
    mNext = new TextView(getContext());

    RelativeLayout.LayoutParams previousParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    previousParams.addRule(RelativeLayout.ALIGN_LEFT);
    previousParams.leftMargin=-28;
    previousParams.topMargin=10;

    RelativeLayout.LayoutParams currentParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    currentParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
    currentParams.topMargin=10;

    RelativeLayout.LayoutParams nextParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    nextParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
    nextParams.rightMargin=-40;
    nextParams.topMargin=10;
    // Groups holding text and arrows
    mPreviousGroup = new LinearLayout(getContext());
    mPreviousGroup.setOrientation(LinearLayout.HORIZONTAL);
    mNextGroup = new LinearLayout(getContext());
    mNextGroup.setOrientation(LinearLayout.HORIZONTAL);

    mPreviousGroup.addView(mPrevious, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    mNextGroup.addView(mNext, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

    addView(mPreviousGroup, previousParams);
    addView(mCurrent, currentParams);
    addView(mNextGroup, nextParams);

    mPrevious.setSingleLine();
    mCurrent.setSingleLine();
    mNext.setSingleLine();

    mPrevious.setText("previous");
    mCurrent.setText("current");
    mNext.setText("next");

    try{
        Typeface tf=Typeface.createFromAsset(getContext().getAssets(), "fonts/trebuc.otf");

        mPrevious.setTypeface(tf);
        mCurrent.setTypeface(tf);
        mNext.setTypeface(tf);

        }catch (Exception e) {
            // TODO: handle exception
            System.out.println(e);
        }


    mPrevious.setClickable(false);
    mNext.setClickable(false);
    mCurrent.setClickable(true);
    mPreviousGroup.setClickable(true);
    mNextGroup.setClickable(true);

    // Set colors
    mNext.setTextColor(Color.argb(255, mUnfocusedTextColor[0], mUnfocusedTextColor[1], mUnfocusedTextColor[2]));
    mPrevious.setTextColor(Color.argb(255, mUnfocusedTextColor[0], mUnfocusedTextColor[1], mUnfocusedTextColor[2]));
    updateColor(0);
}

@Override
public void onPageScrollStateChanged(int state) {

}  

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    positionOffsetPixels = adjustOffset(positionOffsetPixels);
    position = updatePosition(position, positionOffsetPixels);
    setText(position - 1);

    /*System.out.println("PageScrolled:"+(position-1));
    System.out.println("PageScrollednew:"+PresentPosition);
    */updateColor(positionOffsetPixels-1);
    updateArrows(position);
    //updatePositions(positionOffsetPixels);
    updatePositions(position);
    mCurItem = position;
    Bundle ii=new Bundle();
    //ii.putExtra("mcurItem", mCurItem);
    ii.putInt("key", mCurItem);

}

void updatePositions(int positionOffsetPixels){
    int textWidth = mCurrent.getWidth() - mCurrent.getPaddingLeft() - mCurrent.getPaddingRight();
    int maxOffset = this.getWidth() / 2 - textWidth / 2 - mArrowPadding;

    if(positionOffsetPixels > 0){
        maxOffset %= this.getPaddingLeft();
        int offset = Math.min(positionOffsetPixels, maxOffset);
        mCurrent.setPadding(0, 0, 2 * offset, 0);

    }else{

        maxOffset -= this.getPaddingRight();
        int offset = Math.max(positionOffsetPixels, -maxOffset);
        mCurrent.setPadding(-2 * offset, 0, 0, 0);

    }
}


void updateArrows(int position){
    if(mPrevArrow != null){
        mPrevArrow.setVisibility(position == 0 ? View.INVISIBLE : View.VISIBLE);
        mNextArrow.setVisibility(position == mSize - 1 ? View.INVISIBLE : View.VISIBLE);
    }
}


int updatePosition(int givenPosition, int offset){
    int pos;
    if(offset < 0){
        pos = givenPosition + 1;
    }else{
        pos = givenPosition;
    }
    return pos; 
}

/**
 * Fade "currently showing" color depending on it's position
 * 
 * @param offset
 */
void updateColor(int offset){
    offset = Math.abs(offset);
    // Initial condition: offset is always 0, this.getWidth is also 0! 0/0 = NaN
    int width = this.getWidth();
    float fraction = width == 0 ? 0 : offset / ((float)width / 4.0f);
    fraction = Math.min(1, fraction);
    int r = (int)(mUnfocusedTextColor[0] * fraction + mFocusedTextColor[0] * (1 - fraction));
    int g = (int)(mUnfocusedTextColor[1] * fraction + mFocusedTextColor[1] * (1 - fraction));
    int b = (int)(mUnfocusedTextColor[2] * fraction + mFocusedTextColor[2] * (1 - fraction));
    mCurrent.setTextColor(Color.argb(255, r, g, b));
}

/**
 * Update text depending on it's position
 * 
 * @param prevPos
 */
void setText(int prevPos){
    PresentPosition1=prevPos;
    if(prevPos < 0){
        mPrevious.setText("");
    }else{
        mPrevious.setText(mPageInfoProvider.getTitle(prevPos));
        }
    mCurrent.setText(mPageInfoProvider.getTitle(prevPos + 1));
    PresentPosition1=prevPos;

    //System.out.println("present text"+mPageInfoProvider.getTitle(prevPos + 1));


    if(prevPos + 2 == this.mSize){
        mNext.setText("");
    }else{
        mNext.setText(mPageInfoProvider.getTitle(prevPos + 2));
    }
}

// Original:
// 244, 245, 0, 1, 2
// New:
// -2, -1, 0, 1, 2
int adjustOffset(int positionOffsetPixels){
    // Move offset half width
    positionOffsetPixels += this.getWidth() / 2;
    // Clamp to width
    positionOffsetPixels %= this.getWidth();
    // Center around zero
    positionOffsetPixels -= this.getWidth() / 2;
    return positionOffsetPixels;
}

@Override
public void onPageSelected(int position) {
    // Reset padding when the page is finally selected (May not be necessary)
    mCurrent.setPadding(0, 0, 0, 0);
}

class OnPreviousClickedListener implements android.view.View.OnClickListener{
    @Override
    public void onClick(View v) {
        if(mOnClickHandler != null){
            mOnClickHandler.onPreviousClicked(ViewPagerIndicator.this);
        }
    }
}
class OnCurrentClickedListener implements android.view.View.OnClickListener{
    @Override
    public void onClick(View v) {
        if(mOnClickHandler != null){
            mOnClickHandler.onCurrentClicked(ViewPagerIndicator.this);
        }
    }
}
class OnNextClickedListener implements android.view.View.OnClickListener{
    @Override
    public void onClick(View v) {
        if(mOnClickHandler != null){
            mOnClickHandler.onNextClicked(ViewPagerIndicator.this);
        }
    }
}
}

0 个答案:

没有答案