「android edittext」の検索結果
「メモ/TextView」
から
次の単語がハイライトされています :
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;
}
}