0

This app translates form specific graffiti shapes to text.
I have 3 categories, letters, numbers and other characters.
The starting point defines the category to choose the output from. It works will on the emulator but with changing phones (resolution) it starts to get wrong.
This is my activity for drawing the graffiti and the TextView that show the result.

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

This is the activity 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>

This is how I choose the category for now i the java file:

 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;
}
U. Sultan
  • 13
  • 5

1 Answers1

2

it looks to me that you're trying to get the touchEvents from the topmost view and according to the coordinates determine which child is touched? If so this is very wrong. The way to go is to register for the children themselves the onClick or onTouch listener and just check the view's id in there to determine which one was touched.

Edit:

The easiest way to do this is to add this to all three RelativeLayouts that you gave an id: android:onClick="myMethod"

And then add this in your activity

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;
      }
}

you can of course rename the method as you like as long as it is the same as you specified in the xml

Ivo
  • 18,659
  • 2
  • 23
  • 35