回答
必須使用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例如你的手指率:
,或者它可能看起來像這樣:
編輯:
以上類(NetCanvas
)擴展爲View
,因此您可以創建它的一個實例並像使用其他視圖一樣使用該實例。例如,您可以簡單地設置一個實例o f,將它作爲你的Activity.Here的ContentView
我重寫活動的onCreate()
方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new NetCanvas(this));
}
雖然可以更改NetCanvas
與一些其他的變化延伸SurfaceView
。
@mpp請參閱我的編輯。 – hasanghaforian
@mpp我添加了另一個答案,請參閱它。我希望它可以幫助你。 – hasanghaforian
我改變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);
}
}
您可以更改每個變量的值或點的順序來更改結果。結果可能看起來像這些:
我的想法很簡單:從路徑獲取分。如果你想看到更多的細節,大約從路徑獲取點他們行連接,即在getPoints()
方法中完成,可以看到this answer以及它的參考。我想這對你有幫助。
非常好的例子,但它不工作順利。 – voidRy
嘿,你能建議我如何通過擴展SurfaceView來使用相同的代碼?謝謝。 – voidRy
@voidRy你可以看到[本教程](http://www.mindfiresolutions.com/Using-Surface-View-for-Android-1659.php#top)。 – hasanghaforian
- 1. 用畫布繪製線條
- 2. 如何在Android中使用畫布繪製線條?
- 3. 如何讓用戶使用WPF中的畫布繪製線條
- 4. 如何在HTML5畫布上正確繪製多條不同寬度的線條?
- 5. 用畫布繪製流暢的線條
- 6. HTML5畫布 - 如何在圖像背景上繪製線條?
- 7. 如何繪製DC.js系列圖表中不同線條的不同線條圖案?
- 8. Html5畫布 - 使用fabric.js繪製完美線條或不使用
- 9. 如何使用jQuery和HTML5畫布繪製線條
- 10. 使用EaselJS在html5畫布中繪製線條
- 11. 如何使用畫布繪製圖片
- 12. HTML畫布繪製清晰的線條
- 13. 如何在實時畫布上用像素繪製線條
- 14. 如何在PyQt4窗口中的不同畫布中繪製不同的圖形?
- 15. 使用WPF在畫布上繪製線
- 16. Android:如何檢測由畫布繪製的線條中的點?
- 17. 如何使用畫布在位圖中繪製筆畫?
- 18. 如何在畫布上繪製多個繪圖而不繪製同步
- 19. 在畫布中繪製動畫曲線
- 20. 如何縮放用畫布繪製的線條
- 21. 使用請求動畫框在畫布中動畫繪製線條
- 22. 畫布 - 如何繪製一條正在增長的路線
- 23. 如何在圖像上繪製線條/繪畫?
- 24. 如何在html5畫布上繪製移動的重複圖案
- 25. 繪製在畫布光線
- 26. 如何繪製相同的畫布上的兩條曲線中的R
- 27. 翻轉圖像和HTML5畫布中繪製的線條
- 28. Html5畫布圖案繪製延遲
- 29. 繪圖畫布線
- 30. 如何在JPanel中使用paintComponent繪製軸線和線條圖
你在這裏的模式是什麼意思? –
你可以發佈相同的應用程序的鏈接嗎?只是瞭解你的網絡模式是什麼意思? –
是的,先生,現在我知道了。 –