2017-04-03 12 views
0

私が開発しているアプリでは、指定された座標を使ってキャンバス上に線を描画しています。問題は、私はそれの隣に点線を描く必要があるということです。座標はAPIから来ているので、私は破線の座標しか使用できません。これを達成する方法はありますか?私は本当にそれを理解することはできません。私が欲しいものキャンバスに次の破線で描画する

enter image description here

私は私の現在の線を引く方法:

Path line = new Path(); 
boolean first = true; 
for (CircleArea circle : mCircles) { 

    canv.drawCircle(circle.getDrawX(), circle.getDrawY(), mCircleRadius, mCirclePaint); 
    if(!first) { 
     line.lineTo(circle.getDrawX(), circle.getDrawY()); 
    } else { 
     line.moveTo(circle.getDrawX(), circle.getDrawY()); 
    } 

    first = false; 
} 
canv.drawPath(line, mLinePaint); 

サンプル座標:

  • 50,50
  • 75,75
  • を100,75
  • 150,10
  • 170,10
  • 170,75
  • 160,75
+0

サーバーから得られる座標のサンプルリストを提供できますか? –

+0

サンプル座標を追加しました。これらの座標で、キャンバスの最大xとyは200,100です。 –

答えて

0

このコードスニペットは、

Paint paint = new Paint(); 
paint.setStyle(Paint.Style.STROKE); 
paint.setPathEffect(new DashPathEffect(new float[] {20,20}, 0)); 
paint.setColor(Color.RED); 
paint.setStrokeWidth(10); 
canvas.drawPath(line, paint); 
+0

これは破線のみを描画します。私はそれの隣に通常の線と破線を描く必要があります。 –

+0

この2行を別々に描画する必要があり、実線の座標から破線のパス座標を計算する必要があります。 – CodeCameo

+0

'破線のパス座標を計算する'部分は難しい部分です。 –

1

あなたがする必要があるダッシュパスを描画するために使用することができます破線が開始時にメインラインの上に描画され、そのように続行されることを考慮して、以下を実行します。

  1. xだけが変化している場合は、線が水平方向に移動しているので、破線のx座標に距離値を加算するだけでよい。
  2. yだけが変化していれば、
  3. xが正で、xとyの両方が変化している場合は、yを加算するだけです。
  4. xが負で、xとyの両方が変更するだけで、あなたはYから減算する必要があります...など

この方法であなたのオリジナルを追跡します常に座標の最後の値を念頭に置き、新しい座標と比較する操作を行います。コード次

+0

これは、線の角度が90度未満のときに問題にはなりませんか?どのような点から始めたら、どうやって知ることができますか? –

+0

ポイント3と4がこの問題に取り組んでいます。変更する場所を試してみる必要があります。私はちょうどあなたにスタートを与えました – GingerHead

+0

それを稼働させましたか? – GingerHead

0

使用:上記のコード

if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) { 
      this.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
     } 
     Paint p1 = new Paint(); 
     p1.setARGB(255,0,0,0); 
     p1.setStyle(Paint.Style.FILL_AND_STROKE); 

     p1.setStrokeWidth(10); 
     canvas.drawLine(0,50,500,550,p1); 
     p1.setPathEffect(new DashPathEffect(new float[] {20,20},0)); 
     canvas.drawLine(0,0,500,500,p1); 

は、xとyの両方が変更された場合、点線上の行を作成するための一例です。 GingerHeadのロジックと組み合わせることで、あなたは希望のパスを得ることができます。コードの上をループしてGingerHeadのロジックを追加するだけです

関連する問題