AndroidプログラミングLinearLayoutとPullRefreshViewを使ってページをめくる機能を実現する方法

5706 ワード

この例では、AndroidプログラミングがLinearLayoutとPullRefreshViewを使用してページをめくる機能を実現する方法について説明します.皆さんの参考にしてください.具体的には以下の通りです.
前に網易雲を見てクライアントを読んだことがありますが、中の文章は上下に引っ張ってページをめくる効果を実現することができ、体験効果はとてもいいと思います.
会社の新しいバージョンのプロジェクトの開発でも同様の効果を実現することが要求されていますが、プロジェクトの需要の中で、ページを上下に引っ張る総ページ数を実現する必要があることを事前に知ることができます.網易のような総ページ数を事前に知らない感覚でLinearlayoutの中のchildViewをコントロールすれば効果も得られるはずだ.
良い記憶力は腐った筆頭に及ばないで、先に私が事前に総ページ数を知っていて上から下へページをめくる問題を書きましょう!
まずレイアウトは単純なLinearLayoutで包まれています





そしてforサイクルでPullRefreshViewを包みます

pullContentLayout.removeAllViews();
pullViews.clear();
for(int i=0;i 
 

コードの説明:ここのPullToRefreshProViewはオープンソースのドロップダウンリフレッシュコントロールであり、LinearLayout実装を継承しています.ネット上にソースがあります.そしてRightAdapterはBaseAdapterで、このadapterのgetviewで各viewを得て、inflaterから出たPullToRefreshProViewのサブLinearlayoyutにviewを追加します.そして各PullToRefreshProViewにドロップダウンのコールバックインタフェースを設定し、最初はアップしていませんが、最後はドロップダウンしていません.ここのMyOnRefreshListenerは自分で定義したドロップダウンインタフェースです

private class MyOnRefreshListener implements OnHeaderRefreshListener,OnFooterRefreshListener{
    @Override
    public void onFooterRefresh(PullToRefreshProView view) {
    }
    @Override
    public void onHeaderRefresh(PullToRefreshProView view) {
    }
}


それからまたonFooterとonHeaderにドロップダウンの論理を書きます.
ここで重要なのは、アニメーション効果のインタラクティブな実装です.
上のコード、上のアニメーション

public class PullToRefreshUpAnimation extends Animation{
  private View view1,view2;
  private int delt;
  private int topMarginView1 = 0;
  public PullToRefreshUpAnimation(Context context,View v1,View v2,int from,int to){
    super();
    view1 = v1;
    view2 = v2;
    delt = to - from;
    topMarginView1 = view1.getMeasuredHeight();
    setDuration(450);
    setFillAfter(true);
    setInterpolator(new DecelerateInterpolator());
  }
  public PullToRefreshUpAnimation(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
    setDuration(450);
    setFillAfter(true);
    setInterpolator(new DecelerateInterpolator());
  }
  @Override
  protected void applyTransformation(float interpolatedTime, Transformation t) {
    android.widget.LinearLayout.LayoutParams param = (android.widget.LinearLayout.LayoutParams)view2.getLayoutParams();
    param.topMargin = (int) (interpolatedTime*delt);
    param.height = Math.abs(delt);
    android.widget.LinearLayout.LayoutParams param1 = (android.widget.LinearLayout.LayoutParams) view1.getLayoutParams();
    param1.topMargin = (int) (topMarginView1*(interpolatedTime-1));
    param1.height = topMarginView1;
    view1.setLayoutParams(param1);
    view2.setLayoutParams(param);
  }
  @Override
  public boolean willChangeBounds() {
    // TODO Auto-generated method stub
    return true;
  }
}


ドロップダウンアニメーション

public class PullToRefreshAnimation extends Animation{
  private View view;
  private int delt;
  public PullToRefreshAnimation(Context context,View v,int from,int to){
    super();
    view = v;
    delt = to - from;
    setDuration(450);
    setFillAfter(true);
    setInterpolator(new DecelerateInterpolator());
  }
  public PullToRefreshAnimation(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
    setDuration(450);
    setFillAfter(true);
    setInterpolator(new DecelerateInterpolator());
  }
  @Override
  protected void applyTransformation(float interpolatedTime, Transformation t) {
    android.widget.LinearLayout.LayoutParams param = (android.widget.LinearLayout.LayoutParams)view.getLayoutParams();
    param.topMargin = (int) (interpolatedTime*delt);
    param.height = Math.abs(delt);
    param.width = android.widget.LinearLayout.LayoutParams.MATCH_PARENT;
    view.setLayoutParams(param);
  }
  @Override
  public boolean willChangeBounds() {
    // TODO Auto-generated method stub
    return true;
  }
}


この2つのアニメーションの結果は、最後の最外層のLinearLayoutパッケージの各サブLinearLayoutが自分のheightとtopMarginを変えたことです.
だからこのアニメーションにanimationListenerを設定して、それから毎回ドロップダウンアニメーションを必要とする前にLinearlayoutのheightとtopMarginを再設定して、具体的にどのように実現して具体的な状況を見ます.
PS:ここの核心実現方式は実はLinearlayout子LinearlayoutのheightとtopMarginをコントロールすることです
Androidに関する詳細については、「Androidレイアウトlayoutテクニックまとめ」、「Android開発アニメーションテクニックまとめ」、「Android開発入門と進級チュートリアル」、「AndroidビューViewテクニックまとめ」、「Androidプログラミングのactivity操作テクニックまとめ」、「Androidリソース操作テクニックまとめ」および『Androidコントロールの使い方まとめ』
この文書がAndroidプログラムの設計に役立つことを願っています.