2016-06-03 3 views
1

Я использую холст, чтобы сделать простое приложение для рисования. Я использую onTouchEvent для обработки события касания. Я столкнулся с проблемой по вертикальной оси, нарисованная точка отличается от затронутой позиции. вертикальное разделение между касанием и занимаемым положением увеличивается, когда я двигаюсь вверх. Чтобы сделать мою проблему более ясной, я добавляю снимок экрана моего приложения. screen shot андроид холст не рисунок на прикосновенном положении

Синяя линия показывает фактическое касание позиции и красное нарисованное положение.

Вот мой код Mainactivity

public class MainActivity extends AppCompatActivity{ 
    Path mPath; 
    Canvas canvas; 
    Paint paint; 
    float pointX; 
    float pointY; 
    int height; 
    RelativeLayout layout; 
    int layoutHeight; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     layout=(RelativeLayout)findViewById(R.id.main_layout); 
     DisplayMetrics dp=getResources().getDisplayMetrics(); 

     WindowManager windowManager=getWindowManager(); 
     height=windowManager.getDefaultDisplay().getHeight(); 
     int width =windowManager.getDefaultDisplay().getWidth(); 

     Bitmap bg = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
     layout.setBackground(new BitmapDrawable(bg)); 
     canvas=new Canvas(bg); 
     paint=new Paint(Paint.ANTI_ALIAS_FLAG); 
     paint.setColor(Color.RED); 
     paint.setStyle(Paint.Style.STROKE); 
     paint.setStrokeWidth(4); 
     mPath=new Path(); 
     canvas.drawPath(mPath,paint); 
     canvas.drawBitmap(bg,0,0,paint); 
    } 

    public void clearCanvas(View v) { 
     mPath.reset(); 
     canvas.drawColor(0, PorterDuff.Mode.CLEAR); 
     layout.invalidate(); 
    } 
    //override the onTouchEvent 
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     pointX = event.getX(); 
     pointY = event.getY(); 
     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       Log.v("TAG"," action down x:"+pointX+" y:"+pointY); 
       mPath.moveTo(pointX,pointY); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       Log.v("TAG"," actionmove x:"+pointX+" y:"+pointY); 
       mPath.lineTo(pointX,pointY); 
       canvas.drawPath(mPath,paint); 
       break; 
      case MotionEvent.ACTION_UP: 
       break; 
     } 
     layout.invalidate(); 
     return true; 
    } 
} 

расположение XML

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/main_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.vikash.mydrawingapp.MainActivity"> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="clear" 
     android:onClick="clearCanvas" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" /> 
</RelativeLayout> 
+0

разместить свой код здесь –

+0

@DixitPanchal Я добавил код. Пожалуйста, помогите –

+0

Вместо использования 'View.getX()' /'View.getY() ', вы считали' View.getRawX() '/'View.getRawY()'? Таким образом, вы можете получить фактический пиксель, затронутый, и поместите линию с этой координатой. Насколько я могу судить, проблема, с которой вы сталкиваетесь, состоит в том, что нажатая (x) позиция, связанная с вашим экраном, тесно связана с (x) представления, но щелчок (y) «смещен» другим Вид, панель заголовка. – Bonatti

ответ

2

Использование: event.getRawX()

возвращает исходное сырье X координата этого события. Для событий касания на экране это исходное местоположение события на экране, прежде чем оно будет скорректировано для содержащего окна и представлений.

UPD: Я просто пытался повторить ваше приложение и все работает правильно

activity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <com.example.Test 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

</LinearLayout> 

Test.java

public class Test extends View { 

    private Path path = new Path(); 
    private Paint paint = new Paint(); 
    { 
     paint.setColor(Color.GREEN); 
     paint.setStrokeWidth(4); 
     paint.setStyle(Paint.Style.STROKE); 
    } 

    public Test(Context context) { 
     super(context); 
    } 

    public Test(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public Test(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    public Test(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     canvas.drawPath(path, paint); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       path.moveTo(event.getX(), event.getY()); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       path.lineTo(event.getX(), event.getY()); 
       break; 
     } 
     invalidate(); 
     return true; 
    } 

} 
+0

устал, но это не помогло –

+0

да это прекрасно работает. Я пробовал это. Я столкнулся с проблемой, когда добавлял холст на фон mainlayout. Если я использую этот холст, как в вашем ответе, он работает отлично. Спасибо за помощь :) –

0

Ваша проблема в том, что ваш Canvas X-Axis имеет такое же положение экрана оси X, но холст Y -Axis смещен от Y-оси экрана (панель «MyDrawingApp» устанавливает смещение с ее высотой).

Что происходит, когда вы «getY()», он возвращает позицию касания, ссылаясь на весь экран, а не на ваш холст.

Одним из решений является получение положения холста на экране и минус его до значения «getY()». Сделав это, вы получите ощупь внутри своего холста.

Надеюсь, вы поймете меня, я не английский.

Приветствия

+0

Я уже пробовал вычитать смещение. Но это не помогает. В этом только обратном выше происходит то, что разница в canvasY и axisY больше снизу и меньше на вершине –

Смежные вопросы