在Android中创建可伸展、可移动和可旋转的线条可以通过使用Canvas和GestureDetector来实现。下面是一个实现该功能的示例代码:
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
public class CustomView extends View {
private Paint paint;
private Path path;
private float startX, startY;
private float endX, endY;
private boolean isLineSelected;
private GestureDetector gestureDetector;
public CustomView(Context context) {
super(context);
paint = new Paint();
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(5);
path = new Path();
gestureDetector = new GestureDetector(context, new GestureListener());
}
@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:
startX = event.getX();
startY = event.getY();
endX = startX;
endY = startY;
isLineSelected = isLineSelected(startX, startY);
return true;
case MotionEvent.ACTION_MOVE:
if (isLineSelected) {
endX = event.getX();
endY = event.getY();
invalidate();
return true;
}
break;
case MotionEvent.ACTION_UP:
if (isLineSelected) {
endX = event.getX();
endY = event.getY();
isLineSelected = false;
invalidate();
return true;
}
break;
}
return gestureDetector.onTouchEvent(event);
}
private boolean isLineSelected(float x, float y) {
float dx = endX - startX;
float dy = endY - startY;
// Calculate the distance between the start point and touch point
float distance = (float) Math.sqrt(dx * dx + dy * dy);
// Check if the distance is within a threshold value
return distance <= 50;
}
private class GestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if (isLineSelected) {
startX -= distanceX;
startY -= distanceY;
endX -= distanceX;
endY -= distanceY;
invalidate();
return true;
}
return false;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
// Rotate the line 90 degrees
float centerX = (startX + endX) / 2;
float centerY = (startY + endY) / 2;
float dx = startX - centerX;
float dy = startY - centerY;
startX = centerX + dy;
startY = centerY - dx;
endX = centerX - dy;
endY = centerY + dx;
invalidate();
return true;
}
}
}
以上代码创建了一个自定义的View,通过手势操作实现了可伸展、可移动和可旋转的线条效果。可以在XML布局文件中添加该自定义View,或在Java代码中动态添加到布局中。
要使用该自定义View,可以按照以下步骤进行操作:
<LinearLayout 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:orientation="vertical"
tools:context=".MainActivity">
<com.example.customview.CustomView
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
通过以上步骤,你可以在Android中创建一个可伸展、可移动和可旋转的线条,类似于Lucidchart中的线条。
领取专属 10元无门槛券
手把手带您无忧上云