2012年3月14日水曜日

TextViewの任意の位置にスクロールさせる

TextViewの任意の位置にスクロールさせる

参考
AndroidのScrollViewで一番下までスクロールさせるには
ScrollViewを一番下まで自動でスクロールする方法
Scroll TextView to text position
TextView#getLineCountメソッドの戻値がゼロ

ScrollViewを使って、TextViewの任意の位置までスクロールさせるプログラムです。
このプログラムでは、TextViewに設定する大量の文字列群内の中央の文字列に赤色を付けて、その赤色の文字列が存在する中央の位置まで画面をスクロールさせます。

Javaのsample codeは次のとおりです。

public class ScrollTextActivity extends Activity
    implements
    OnClickListener
    {
    Button bu;
    TextView tv;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        SpannableStringBuilder sb;
        int i, j;
        BackgroundColorSpan spanBC;
        final String sData = "あいうえお";
        
        bu = (Button)findViewById(R.id.Button);
        bu.setOnClickListener(this);

        //適当に文字列データを作成する。
        spanBC = new BackgroundColorSpan(0xff880000);
        
        sb = new SpannableStringBuilder();
        for(i=0, j=0; i<300; i++, j++) sb.append(sData);
        j *= sData.length();
        for(i=0; i<300; i++) sb.append(sData);
        sb.setSpan(spanBC, j, j+sData.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        
        tv = (TextView)findViewById(R.id.TextView);
        tv.setText(sb);
        
        //onCreateメソッドが実行される時点ではスクロールはできない。
        //ScrollView sv;
        //sv = (ScrollView)findViewById(R.id.ScrollView);
        //sv.smoothScrollTo(0, 500);//効果の無いコマンド
    }
    
    @Override
    public void onClick(View v) {
        if(v==bu){
            //Viewが作成された後で、スクロールが可能になる。
            ScrollView sv;
            int iLine, iPixel, iHeight, i;
            
            sv = (ScrollView)findViewById(R.id.ScrollView);
            iLine = tv.getLineCount ();
            iLine /= 2;
            iPixel = tv.getLineHeight ();
            iHeight = sv.getHeight ();
            i = iLine * iPixel;
            i -= iHeight / 2;
            sv.smoothScrollTo(0, i);//実行可能
        }
    }
}

xmlは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    >
    <Button
        android:id="@+id/Button"
        android:text="@string/Button"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        >
    </Button>
    <ScrollView
        android:id="@+id/ScrollView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        >
        <TextView
            android:id="@+id/TextView"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            >
        </TextView>
    </ScrollView>
</LinearLayout>

0 件のコメント:

コメントを投稿