2015-07-04 5 views
1

Я пытаюсь добиться, что один пункт под названием first в моем коде, чтобы присоединиться к второй точке second с помощью движения пальцев от first точки к second, линия не должна быть прямой, независимо от того, что, и если first точка не достигнет second точки, линия должна исчезнуть в ACTION_UP.Как рисовать Straignt Line между двумя точками?

Я получил вдохновение от: https://play.google.com/store/apps/details?id=nf.co.sumwu.dropdot&hl=en

Я пытаюсь добиться этого с помощью метода OnDraw с CustomView

Вот моя попытка:

public class MyGFX extends View{ 

// setup initial color 
    private final int paintColor = Color.BLACK; 
    // defines paint and canvas 
    private Paint drawPaint; 

    Point first , second; 

    private Path path = new Path(); 

public MyGFX(Context context,AttributeSet attrs) { 
    super(context, attrs); 
    setupPaint(); // same as before 
    first = new Point(100,100); 
    second = new Point(200,100); 
} 

// Get x and y and append them to the path 
public boolean onTouchEvent(MotionEvent event) { 
    float pointX = event.getX(); 
    float pointY = event.getY(); 
    // Checks for the event that occurs 
    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     boolean insideCircle = 
       (2*((int)pointX - (first.x + 2))) + (2*((int)pointY - (first.y + 2))) <= (2 * 2); 

     if(insideCircle){ 
      // Starts a new line in the path 
      path.moveTo(first.x,first.y); 
      Toast.makeText(getContext(), "path.moveto is called \n first.x = " 
      +first.x+" first.y = "+first.y+" px ="+pointX+" py ="+pointY, 
        Toast.LENGTH_SHORT).show(); 
     } 

     break; 
    case MotionEvent.ACTION_MOVE: 
     boolean insideCircle2 = 
     (2*(pointX - (second.x + 2))) + (2*(pointY - (second.y + 2))) <= (2 * 2); 

     if(insideCircle2){ 
      // Starts a new line in the path 
      path.moveTo(pointX, pointY); 
     } 
     // Draws line between last point and this point 
     path.lineTo(pointX, pointY); 
     postInvalidate(); // Indicate view should be redrawn 

     break; 
    case MotionEvent.ACTION_UP: 
     path.close(); 
     break; 
    default: 
     return false; 
    } 

    return true; // Indicate we've consumed the touch 
} 

// Setup paint with color and stroke styles 
    private void setupPaint() { 
    drawPaint = new Paint(); 
    drawPaint.setColor(paintColor); 
    drawPaint.setAntiAlias(true); 
    drawPaint.setStrokeWidth(5); 
    drawPaint.setStyle(Paint.Style.STROKE); 
    drawPaint.setStrokeJoin(Paint.Join.ROUND); 
    drawPaint.setStrokeCap(Paint.Cap.ROUND); 
    } 

// Draws the path created during the touch events 
    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawCircle(first.x, first.y, 2, drawPaint); 
     canvas.drawCircle(second.x, second.y, 2, drawPaint); 

     if(!path.isEmpty()) 
      canvas.drawPath(path, drawPaint); 


    } 


} 
+0

общие парни кто-нибудь? –

+0

https://gist.github.com/lecho/4332335 проверьте это ... надеюсь, что это поможет ... спросите далее :) –

+0

@thestalker Я собираюсь попробовать его, а затем снова отправить. –

ответ

2

Попробуйте ................

layout.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:paddingLeft="@dimen/activity_horizontal_margin" 
     android:paddingRight="@dimen/activity_horizontal_margin" 
     android:paddingTop="@dimen/activity_vertical_margin" 
     android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 

     <play.decisio.com.myapplication.ConnectDotsView 
      android:layout_width="match_parent" 
      android:id="@+id/dot" 
      android:layout_height="match_parent" /> 

    </RelativeLayout> 

MainActivity.java

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     view=(ConnectDotsView)findViewById(R.id.dot); 
     List<Point> point=new ArrayList<Point>(); 
     for(int i=0;i<5;i++){ 
      point.add(new Point(i*100+100, i*100+10)); 
     } 
     view.setPoints(point); 
    } 
+0

Man Вы потрясающий, я работал в течение 2 дней подряд, чтобы найти этот результат, спасибо –

+0

u r welcome !!! :) –

1

Использование Canvas.drawLine().

drawLine(float startX, float startY, float stopX, float stopY, Paint paint)

так

canvas.drawLine(10.0, 5.0, 11.0, 12.6,...);

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