Androidリーダーのページングを簡単に実現
2858 ワード
とても小さなリーダーを書きました.ページング機能を実現する際、ずっと考えられなかった.その後、とても特別な方法を考えました.テストにより、ページング機能を完璧に実現できます.
主な考え方:
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として作成することで、ページングをスライドすることができます.
キーコード:
説明:コードは主にページ分けの考え方を説明し、その中に多くのバグがある.
次はページング用のPagerAdapterで、リソースを節約するためにTextViewを多重化しています.
最後:
テキストの内容が大きい場合は、セグメント化してロードすることで、開くスピードを速めることができます.すなわち、表示のためにテキストの一部をロードし、残りのテキストをバックグラウンドスレッドにロードします.
主な考え方:
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);
}
}
最後:
テキストの内容が大きい場合は、セグメント化してロードすることで、開くスピードを速めることができます.すなわち、表示のためにテキストの一部をロードし、残りのテキストをバックグラウンドスレッドにロードします.