Androidリーダーのページングを簡単に実現


とても小さなリーダーを書きました.ページング機能を実現する際、ずっと考えられなかった.その後、とても特別な方法を考えました.テストにより、ページング機能を完璧に実現できます.
主な考え方:
1、テキストの内容をTextViewに記入し、setTextを呼び出して一言で済ませる.2.TextViewの高さ範囲で表示できる行数を計算します.TextViewが画面全体を占める場合、画面範囲に表示できる関数を計算します.TextViewのgetLineBounds関数を用いて,各行占有の高さhを計算することができる.hとTextViewの高さHを利用すれば表示可能な行数の算出が容易になる.3、肝心な一歩.TextView n行に表示されるフォントの個数を計算します.これは最も重要なAPIであり、この機能を実現できるのは主にそれに頼っている.またTextView自体もこのAPIを利用して自動改行を実現している.
これがStatiLayoutです.StatiLayoutには、0からn行のフォントの個数を計算できる関数getLineEnd(n)があります.TextViewの1ページに表示される行数は固定されており、
ページ分けの難点は、1行あたりのフォント数が固定されていないことです.getLineEndで1ページあたりのフォント数を非常に簡単に計算できます.
4、各ページのフォント数でテキスト内容から各ページの内容を切り取る.
PagerAdapterを使用してテキストの内容をTextViewとして作成することで、ページングをスライドすることができます.
キーコード:
説明:コードは主にページ分けの考え方を説明し、その中に多くのバグがある.
  public int[] getPage( TextView textView){
        int count=textView.getLineCount();
        textView.setText(mContent);
        int pCount=getPageLineCount(textView);
        int pageNum=count/pCount;
        int page[]=new int[pageNum];
        for(int i=0;i

次はページング用のPagerAdapterで、リソースを節約するためにTextViewを多重化しています.
public class ContentAdapter extends PagerAdapter {
    List mCache;
    private int[] mPage;
    private String mContent;

    public ContentAdapter(int[] page, String content){
        mPage=page;
        mContent=content;
    }
    @Override
    public int getCount() {
        return mPage.length;
    }
    @Override
    public boolean isViewFromObject(View view, Object object) {
        return  view==object;
    }
    private String getText(int page){
        if(page==0){
            return mContent.substring(0,mPage[0]);
        }
        return mContent.substring(mPage[page-1],mPage[page]);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        TextView textView=null;
        if(mCache==null){
            mCache=new LinkedList();
        }
        if(mCache.size()>0){
            textView=(TextView) mCache.remove(0);
        }else {
            textView=new TextView(container.getContext());
        }
        textView.setText(getText(position));
        container.addView(textView);
        return textView;
    }
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View)object);
        mCache.add(object);
    }
}

最後:
テキストの内容が大きい場合は、セグメント化してロードすることで、開くスピードを速めることができます.すなわち、表示のためにテキストの一部をロードし、残りのテキストをバックグラウンドスレッドにロードします.