今日の雑記

生きることでいっぱいいっぱい

「TextView」を上下左右にスクロールさせたかった話

最近細かいツールを Android でいくつか作ってるんですが、手元の端末が何せ低解像度(HVGA)なので、ちょっと色々表示しようとするとすぐ画面外にテキストが出てしまいます。
そんな時はまあ「スクロールすればいいべ」となるわけですが、Android で「上下左右に自由にスクロール」するという話をなかなか見かけませんでした。まあ、ボクのやり方(主に定義ファイルベースではなくコードベースでやろうとしている)とかググりかたが悪かっただけかもしれませんが。
んでまあ、閃きと勘でなんとかなったので、簡単に話した上で以下にコードとかのサンプルはっつけておきます。
定義ファイルベースの話(Android では XML ですね)は出てくるのでそれを読んでみると、どうも「View に View をはっつけるとできそう」みたいな感じでした。
具体的に、今回やろうとしたというか実際にやった感じでは、

  • HorizonalScrollView(横方向のスクロールビュー)
    • ScrollView(縦方向のスクロールビュー)
      • LinerLayout(縦方向のレイアウト)
        • TextView(実際に表示されるビュー)

まあこんな感じで作りました。それと、「横方向」と「縦方向」は恐らく逆でも問題ないと思います。
コードは以下のような感じです。

package com.hwp.hogetest;

import java.util.*;
import java.text.*;

import android.content.*;
import android.view.*;
import android.graphics.*;
import android.widget.*;

public class HogeHogeView extends HorizonalScrollView
{
    private HogeScrollView mHogeScrollView;
    private HogeLayoutView mHogeLayoutView;

    public HogeHogeView(Context context)
    {
        super(context);
        mHogeScrollView = new HogeScrollView(context);
        addView(mHogeScrollView);
    }

    private class HogeScrollView extends ScrollView
    {
        public HogeScrollView(Context context)
        {
            super(context);
            mHogeLayoutView = new HogeLayoutView(context);
            addView(mHogeLayoutView);
        }
    }

    private class HogeLayoutView extends LinearLayout
    {
        public HogeLayoutView(Context context)
        {
            super(context);
            setOrientation(LinearLayout.VERTICAL);
            HogeTextView p = new HogeTextView(context);
            p.setText("Hoge test");
            addView(p);
        }
    }

    private class HogeTextView extends TextView
    {
        public HogeTextView(Context context)
        {
            super(context);
            setTextSize(16.0f);
            setSingleLine();
        }

        @Override
        protected void onDraw(Canvas canvas)
        {
            if(HogeData.mIsHogeUpdate == true){
                // ここで更新があったらテキストの追加処理とか
                HogeData.mIsHogeUpdate = false;
            }
            super.onDraw(canvas);
            invalidate();
        }
    }
}

これで、期待通りのの動作になりました。