在android中定义起点?

时间:2016-06-14 14:13:41

标签: java android

此应用程序将表单特定的涂鸦形状转换为文本 我有3个类别,字母,数字和其他字符 起点定义了从中选择输出的类别。它可以在模拟器上工作,但随着手机(分辨率)的变化,它开始出错。
这是我绘制涂鸦的活动和显示结果的TextView。

http://i.stack.imgur.com/iEY5i.png

这是活动XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.soltan.app1.MainActivity"
    android:background="#0e004e"
    android:animateLayoutChanges="false"
    >


    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/res"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:background="#ffffff"
        android:textDirection="anyRtl"
        android:hint="@string/mess"
        android:layout_above="@+id/chars" />

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="105dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:background="#ffffff"
        android:layout_marginTop="5dp"
        android:id="@+id/letters"
        android
        >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:id="@+id/txt3"
            android:layout_alignParentTop="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:textDirection="anyRtl"
            android:hint="@string/txt3" />
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="175dp"
        android:layout_height="90dp"
        android:layout_above="@+id/letters"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:background="#ffffff"
        android:layout_marginTop="5dp"
        android:id="@+id/chars"
        android:layout_alignParentRight="false"
        android:layout_marginRight="5dp"
        android:layout_alignParentEnd="false"
        android:focusable="false">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:id="@+id/txt1"
            android:layout_alignParentTop="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:textDirection="anyRtl"
            android:hint="@string/txt1" />
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="175dp"
        android:layout_height="90dp"
        android:layout_above="@+id/letters"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:background="#fff"
        android:layout_toRightOf="@+id/chars"
        android:id="@+id/numbers">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:id="@+id/txt2"
            android:layout_alignParentTop="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:textDirection="anyRtl"
            android:hint="@string/txt2" />
    </RelativeLayout>

</RelativeLayout>

这就是我现在为java文件选择类别的方法:

 private List<Point> input; // a list contains the drawn graffiti shape coordinates 
private Input inserted; // instance of a class
String section; // the category from which we receive the output
boolean proceed ; // if the starting point in the allowed range

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

}

public boolean onTouchEvent(MotionEvent touchEvent)
{
    super.onTouchEvent(touchEvent);
    switch(touchEvent.getAction())
    {
        case MotionEvent.ACTION_DOWN:
        {
            input = new ArrayList<>();

            if(touchEvent.getY() < 1216)
            {
                proceed = false;
            }
            else if(touchEvent.getY() > 1465)
            {
                proceed = true;
                 section = "letter";
            }
            else if(touchEvent.getX() < 506)
            {
                proceed = true;
                section = "char";
            }
            else
            {
                proceed = true;
                section = "number";
            }
            //Inserting the touch event points into the array list of points
            for (int h = 0; h < touchEvent.getHistorySize(); h++)
            {
                for (int p = 0; p < touchEvent.getPointerCount(); p++)
                {
                    float x = touchEvent.getHistoricalX(p,h);
                    float y = touchEvent.getHistoricalY(p,h);
                    input.add(new Point(x,y));
                }
            }
            break;
        }
        case MotionEvent.ACTION_MOVE:
        {
            //Inserting the touch event points into the array list of points
            for (int h = 0; h < touchEvent.getHistorySize(); h++)
            {
                for (int p = 0; p < touchEvent.getPointerCount(); p++)
                {
                    float x = touchEvent.getHistoricalX(p,h);
                    float y = touchEvent.getHistoricalY(p,h);
                    input.add(new Point(x,y));
                }
            }
            break;
        }
        case MotionEvent.ACTION_UP:
        {
            //Inserting the touch event points into the array list of points
            for (int h = 0; h < touchEvent.getHistorySize(); h++)
            {
                for (int p = 0; p < touchEvent.getPointerCount(); p++)
                {
                    float x = touchEvent.getHistoricalX(p,h);
                    float y = touchEvent.getHistoricalY(p,h);
                    input.add(new Point(x,y));
                }
            }
            if(proceed)
            {
                inserted = new Input();
                String letter =inserted.checkPoint(input,section);
                if(letter.equals(""))
                {
                    Toast.makeText(this,"No Such Graffiti, check the our dictionary!",Toast.LENGTH_SHORT).show();
                }
                TextView myText =(TextView) findViewById(R.id.res);
                String text = myText.getText().toString();
                myText.setText(text+letter);
            }
            break;
        }
    }
    return true;
}

1 个答案:

答案 0 :(得分:2)

在我看来,您正试图从最顶层的视图中获取touchEvents,并根据坐标确定触摸了哪个孩子?如果是这样,这是非常错误的。要做的就是为孩子们自己注册onClick或onTouch监听器,然后检查视图中的id以确定触摸了哪一个。

编辑:

最简单的方法是将此添加到您提供id的所有三个RelativeLayouts: android:onClick="myMethod"

然后在您的活动中添加此内容

public void myMethod(View view) {
     switch(view.getId()) {
        case R.id.letters:
          //do here what you wanna do with letters
          break;
        case R.id.chars:
          //do here what you wanna do with chars
          break;
        case R.id.numbers:
          //do here what you wanna do with numbers
          break;
      }
}

您可以根据需要重命名该方法,只要它与您在xml中指定的方法相同