1

私は 5x5 のグリッドを持っています (キャンバスにマトリックスを描画しました)。グリッド内のテキストビューを配列、つまり (5X5) 配列の順序で配置しました。問題は、水平または垂直にスワイプしたときにテキストビューの値を変更したいということです。

[4][0] から [4][2] まで連続して画面上でタッチ動作を使用しているとします。これらの場所のテキストビューの値を変更したいとします。

何か案は?

4

1 に答える 1

1

このコードはあなたを助けるかもしれません:

public class MyClass extends Activity implements OnGestureListener{
    ArrayList<TextView> tvs = new ArrayList<TextView>();
    public void onCreate(Bundle b) {
        super.onCreate(b);
        setContentView(R.layout.mygrid);
    }

    public void onResume() {
        super.onResume();
        GestureOverlayView gd = (GestureOverlayView)findViewById(R.id.gd);
        LinearLayout g = (LinearLayout)findViewById(R.id.mygrid);
        gd.addOnGestureListener(this);
        g.setOrientation(LinearLayout.VERTICAL);
        for (int i = 0; i < 5; i++) {
            LinearLayout row = new LinearLayout(this);
            g.addView(row);
            row.setOrientation(LinearLayout.HORIZONTAL);
            LinearLayout.LayoutParams rowlp = (LayoutParams) row.getLayoutParams();
            rowlp.width = LayoutParams.MATCH_PARENT;
            rowlp.weight = 1;
            rowlp.height = LayoutParams.WRAP_CONTENT;
            row.setLayoutParams(rowlp);
            for (int j = 0; j < 5; j++) {
                TextView tv = new TextView(this);
                row.addView(tv);
                LinearLayout.LayoutParams lp = (LayoutParams) tv.getLayoutParams();
                lp.height = LayoutParams.MATCH_PARENT;
                lp.width = 0;
                lp.weight = 1;
                tv.setLayoutParams(lp);
                tv.setText(String.valueOf(i * 5 + j));
                tv.setTag(String.valueOf(i * 5 + j));
                tv.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL);
                tvs.add(tv);
                if ((i * 5 + j) % 2 == 0)
                    tv.setBackgroundColor(0xff888888);
            }
        }
    }

    private boolean isPointInsideView(float x, float y, View view){
        int location[] = new int[2];
        view.getLocationOnScreen(location);
        int viewX = location[0];
        int viewY = location[1];

        //point is inside view bounds
        if(( x > viewX && x < (viewX + view.getWidth())) &&
                ( y > viewY && y < (viewY + view.getHeight()))){
            return true;
        } else {
            return false;
        }
    }

    @Override
    public void onGesture(GestureOverlayView overlay, MotionEvent event) {
        float x = event.getRawX();
        float y = event.getRawY();
        for (TextView v : tvs) {
            if (isPointInsideView(x, y, v)) {
                v.setText("HERE");
            }
        }
    }

    @Override
    public void onGestureCancelled(GestureOverlayView overlay, MotionEvent event) {

    }

    @Override
    public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {

    }

    @Override
    public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) {

    }
}

XML:

<?xml version="1.0" encoding="utf-8"?>
<android.gesture.GestureOverlayView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/gd"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/mygrid"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</android.gesture.GestureOverlayView>

それが役に立てば幸い。

Edit2: 上記のメソッドを次のメソッドに置き換えて、パフォーマンスを大幅に向上させます。

private TextView getAbove(float x, float y) {
    for (int i = 0; i < 5; i++)
        for (int j = 0; j < 5; j++)
            if (isPointInsideView(x, y, tvs[i][j]))
                return tvs[i][j];
    return null;
}

@Override
public void onGesture(GestureOverlayView overlay, MotionEvent event) {
    float x = event.getRawX();
    float y = event.getRawY();
    if (last == null || !isPointInsideView(x, y, last)) {
        last = getAbove(x,y);
        draw();
    }   
}

private void draw() {
    if (last == null)
        return;
    last.setText("+");
}
private void reset() {
    last = null;
    for (int i = 0; i < 5; i++)
        for (int j = 0; j < 5; j++)
            tvs[i][j].setText(String.valueOf(i * 5 + j));
}

@Override
public void onGestureCancelled(GestureOverlayView overlay, MotionEvent event) {
    reset();
}
@Override
public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {
    reset();
}
@Override
public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) {
    last = getAbove(event.getRawX(), event.getRawY());
    draw();
}

TextView[][] tvs = new TextView[5][5];
TextView last = null;

そして を にarraylistしますTextView[5][5]

于 2013-01-22T16:20:31.200 に答える