2013-01-08 22 views
6

嘿,我想通過使用畫布在不同的模式中繪製一條線。如何使用畫布在不同的圖案中繪製線條?

任何想法或建議都很感激.. !!!!

在此先感謝。

+0

你在這裏的模式是什麼意思? –

+0

你可以發佈相同的應用程序的鏈接嗎?只是瞭解你的網絡模式是什麼意思? –

+0

是的,先生,現在我知道了。 –

回答

3

必須使用Path .Docs說:

Path類封裝化合物(多輪廓)幾何 路徑包括直線段,二次曲線,和 三次曲線的。 ...

例如,你可以在你的view.Then方法onTouchEvent(MotionEvent event)擴展view,並添加觸摸事件的位置到path必須生成隨機位置對應於最新的觸摸事件以及它們添加到其他實例path.Finally在您的視圖onDraw()方法,繪製所有paths.I希望這個片段可以幫助您瞭解我的想法:

public class NetCanvas extends View { 

    private static final double MAX_DIFF = 15; 
    Path path0 = new Path(); 
    Path path = new Path(); 
    private Paint p0; 
    private Paint p; 

    public NetCanvas(Context context) { 
     super(context); 
     p0 = new Paint(); 
     p0.setShader(new LinearGradient(0, 0, 230, getHeight(), Color.GREEN, 
       Color.RED, Shader.TileMode.CLAMP)); 
     p0.setStyle(Style.STROKE); 

     p = new Paint(); 
     p.setShader(new LinearGradient(0, 0, 230, getHeight(), Color.BLUE, 
       Color.MAGENTA, Shader.TileMode.CLAMP)); 
     p.setStyle(Style.STROKE); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     float x0 = event.getX(); 
     float y0 = event.getY(); 
     float x = generateFloat(event.getX()); 
     float y = generateFloat(event.getY()); 

     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      path0.moveTo(x0, y0); 
      path0.lineTo(x0, y0); 

      path.moveTo(x, y); 
      path.lineTo(x, y); 
     } else if (event.getAction() == MotionEvent.ACTION_MOVE) { 
      path0.lineTo(x0, y0); 

      path.lineTo(x, y); 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      path0.lineTo(x0, y0); 

      path.lineTo(x, y); 
     } 
     invalidate(); 
     return true; 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     canvas.drawPath(path0, p0); 
     canvas.drawPath(path, p); 
    } 

    private float generateFloat(Float f){ 
     double d = (Math.signum(2*Math.random() - 1)) * Math.random() * MAX_DIFF; 
     return (float) (f + d); 
    } 
} 

在上面的代碼中,我用了兩個path S,但你可以使用三種或更多。還有的結果,取決於對screen.For例如你的手指率:
enter image description here

,或者它可能看起來像這樣:

enter image description here

編輯:

以上類(NetCanvas)擴展爲View,因此您可以創建它的一個實例並像使用其他視圖一樣使用該實例。例如,您可以簡單地設置一個實例o f,將它作爲你的Activity.Here的ContentView我重寫活動的onCreate()方法:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new NetCanvas(this)); 
    } 

雖然可以更改NetCanvas與一些其他的變化延伸SurfaceView

+0

@mpp請參閱我的編輯。 – hasanghaforian

+0

@mpp我添加了另一個答案,請參閱它。我希望它可以幫助你。 – hasanghaforian

1

我改變NetCanvas畫出的形狀看起來像你的問題第二圖像:

public class NetCanvas1 extends View { 

    Path path0 = new Path(); 
    private Paint p0; 
    private int points_Num = 20; 
    private int first_Points_Num = 5; 

    public NetCanvas1(Context context) { 
     super(context); 
     p0 = new Paint(); 
     p0.setShader(new LinearGradient(0, 0, 230, getHeight(), Color.GREEN, 
       Color.RED, Shader.TileMode.CLAMP)); 
     p0.setStyle(Style.STROKE); 

    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     float x0 = event.getX(); 
     float y0 = event.getY(); 

     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      path0.moveTo(x0, y0); 
      path0.lineTo(x0, y0); 

     } else if (event.getAction() == MotionEvent.ACTION_MOVE) { 
      path0.lineTo(x0, y0); 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      path0.lineTo(x0, y0); 
      invalidate(); 
     } 
     return true; 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     canvas.drawPath(path0, p0); 
     FlaotPoint[] pointArray = getPoints(); 
     try { 
      for (int i = 0; i < first_Points_Num; i++) { 
       for (int j = i; j < pointArray.length; j++) { 
        canvas.drawLine(pointArray[i].getX(), pointArray[i].getY(), 
          pointArray[j].getX(), pointArray[j].getY(), p0); 
       } 
      } 
      path0.reset(); 
     } catch (Exception e) { 
     } 
    } 

    private FlaotPoint[] getPoints() { 
     FlaotPoint[] pointArray = new FlaotPoint[points_Num]; 
     PathMeasure pm = new PathMeasure(path0, false); 
     float length = pm.getLength(); 
     float distance = 0f; 
     float speed = length/points_Num; 
     int counter = 0; 
     float[] aCoordinates = new float[2]; 

     while ((distance < length) && (counter < points_Num)) { 
      // get point from the path 
      pm.getPosTan(distance, aCoordinates, null); 
      pointArray[counter] = new FlaotPoint(aCoordinates[0], 
        aCoordinates[1]); 
      counter++; 
      distance = distance + speed; 
     } 

     return pointArray; 
    } 

    class FlaotPoint { 
     float x, y; 

     public FlaotPoint(float x, float y) { 
      this.x = x; 
      this.y = y; 
     } 

     public float getX() { 
      return x; 
     } 

     public float getY() { 
      return y; 
     } 
    } 
} 

結果取決於points_Num,即在for循環用線連接點的first_Points_Num和訂單值:

for (int i = 0; i < first_Points_Num; i++) { 
       for (int j = i; j < pointArray.length; j++) { 
        canvas.drawLine(pointArray[i].getX(), pointArray[i].getY(), 
          pointArray[j].getX(), pointArray[j].getY(), p0); 
       } 
      } 

您可以更改每個變量的值或點的順序來更改結果。結果可能看起來像這些:

enter image description hereenter image description here

我的想法很簡單:從路徑獲取分。如果你想看到更多的細節,大約從路徑獲取點他們行連接,即在getPoints()方法中完成,可以看到this answer以及它的參考。我想這對你有幫助。

+1

非常好的例子,但它不工作順利。 – voidRy

+0

嘿,你能建議我如何通過擴展SurfaceView來使用相同的代碼?謝謝。 – voidRy

+0

@voidRy你可以看到[本教程](http://www.mindfiresolutions.com/Using-Surface-View-for-Android-1659.php#top)。 – hasanghaforian

相關問題