メモ > TextView

「android edittext」の検索結果
メモ/TextView」 から 次の単語がハイライトされています :


TextView,EditText

テキストを表示、編集するView。
Viewの内部でユーザ自身が入力を行う場合はEditText、それ以外はTextViewを使う。

BufferType

Normal
文字装飾などを含まないテキスト。
Spannable
文字装飾やURLSpanなどを含むテキスト
Editable
実行時にappendやreplaceやユーザによる編集によって内容の一部が変化するテキスト。

おまけ


今のTextViewはonMotionEventを全く見ていないので軽く拡張してみる。

import java.util.Map;
import android.text.Layout;
import android.text.Selection;
import android.text.Spannable;
import android.text.method.InputMethod;
import android.text.method.MovementMethod;
import android.text.method.TransformationMethod;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.content.Context;
import android.widget.TextView;

public class ExTextView extends android.widget.TextView {
   public ExTextView(Context context){
       this(context, (AttributeSet)null, ((Map) (null)));
   }
   public ExTextView(Context context, MovementMethod movement, InputMethod input){
       this(context, null, null, movement, input, null, 0x1010025);
   }
   public ExTextView(Context context, MovementMethod movement, InputMethod input, TransformationMethod transformation){
       this(context, null, null, movement, input, transformation, 0x1010025);
   }
   public ExTextView(Context context, AttributeSet attrs, Map inflateParams){
       this(context, attrs, inflateParams, null, null, null, 0x1010025);
   }
   public ExTextView(Context context, AttributeSet attrs, Map inflateParams, int defStyle){
       this(context, attrs, inflateParams, null, null, null, defStyle);
   }
   public ExTextView(Context context, AttributeSet attrs, Map inflateParams, MovementMethod movement, InputMethod input, TransformationMethod transformation, int defStyle){
       super(context, attrs, inflateParams, defStyle);
   }

   // Viewの座標系から文字オフセットに変換
   public int getOffset(int x,int y){
       x-= mPaddingLeft;
       y-= mPaddingTop;
       Layout l = getLayout();
       int line = l.getLineForVertical(y);
       if( line == 0 && y < l.getLineTop(line) ) return 0;
       if( line >= l.getLineCount()-1 && y >= l.getLineTop(line+1) ) return l.getText().length();
       int offset = l.getOffsetForHorizontal(line,x);
       return offset;
   }

   // ドラッグ開始位置
   int mOffsetDragStart = -1;
   // ドラッグ終了位置
   int mOffsetDragEnd;
   // クリック操作か範囲選択操作か
   boolean mClickMode;
   int mDragStartX;
   int mDragStartY;

   // ドラッグ終了位置を更新
   private void updateDragSelection(int x,int y,boolean finish){
       if( mOffsetDragStart != -1 ){
           // ScrollViewとの親和性のため、移動中の誤差は無視する
           if( !finish && mClickMode ){
               int dx = x - mDragStartX; if(dx<0) dx = -dx;
               int dy = y - mDragStartY; if(dy<0) dy = -dy;
               int lh = getLineHeight();
               // 1行の高さに対して横方向3割、縦方向7割くらい
               if( dx*10 < lh*3 &&  dy*10 < lh*7 ) return;
           }
           mOffsetDragEnd = getOffset(x,y);
           if( mOffsetDragStart != mOffsetDragEnd ) mClickMode = false;
           if( mOffsetDragStart < mOffsetDragEnd ){
               Selection.setSelection((Spannable)getText(),mOffsetDragStart,mOffsetDragEnd);
           }else{
               Selection.setSelection((Spannable)getText(),mOffsetDragEnd,mOffsetDragStart);
           }
           if(finish){
               if( mClickMode ){
                   int keyCode = KeyEvent.KEYCODE_DPAD_CENTER;
                   onKeyDown(keyCode,new KeyEvent(KeyEvent.ACTION_DOWN,keyCode));
                   onKeyDown(keyCode,new KeyEvent(KeyEvent.ACTION_UP,keyCode));
               }
           }
       }
   }

   // モーションイベントハンドラ
   @Override
   public boolean onMotionEvent(MotionEvent event){
       // Log.d("ExTextView",event.toString());
       int x = (int)(0.5+event.getX());
       int y = (int)(0.5+event.getY());
        switch( event.getAction() ){
        case MotionEvent.ACTION_DOWN:
           mClickMode = true;
           mOffsetDragStart = getOffset(x,y);
           mDragStartX = x;
           mDragStartY = y;
           break;
        case MotionEvent.ACTION_MOVE:
           updateDragSelection(x,y,false);
           break;
       case MotionEvent.ACTION_UP:
           updateDragSelection(x,y,true);
           // fall
       default: // キャンセル他
           mOffsetDragStart =-1;
       }
       return true;
   }
}

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:1970年01月01日 09:00
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。