如何在 Android Studio 中制作填充三角形(由路径绘制)的动画

How to animate a filled triangle (drawn by a path) in Android Studio

我正在尝试为 Android 构建一个类似拼图的应用程序,它涉及用户通过触摸事件在屏幕上移动多边形块。

我可以画一个三角形,然后填充它。我也可以在屏幕上平滑地移动它,但它会留下痕迹 - 这样屏幕就会迅速填满 :-( 所以我想知道如何调整 onDraw 方法,以便不包括三角形的先前位置。还是有其他技术?这个问题以前问过一次,但没有得到满意的答案。我对 Android 工作还很陌生,所以我相信好心的专家能够为我指明正确的方向!

观点:

public class GameView 扩展视图 {

public Triangle T1;
Paint paint = new Paint();
private Path path;

public GameView(Context context) {
    super(context);
    paint.setStyle(Paint.Style.FILL);
    paint.setColor(Color.GREEN);
    initTriangle();
}

public void initTriangle() {
    int T1Points[][] = new int[3][2];

    T1Points[0][0] = -200;
    T1Points[0][1] = -100;
    T1Points[1][0] = 200;
    T1Points[1][1] = -100;
    T1Points[2][0] = 0;
    T1Points[2][1] = 100;

    float[] position = new float[2];
    position[0] = (float) 200.0;
    position[1] = (float) 100.0;

    T1 = new Triangle("T1", T1Points,  position);

    path = T1.getPath();
}

@Override
public boolean onTouchEvent(MotionEvent event) {

    float[] pos = new float[2];
    pos[0] = event.getX(); //nextx;
    pos[1] = event.getY(); //nexty;
    T1.setPosition(pos );
    Path path = new Path();
    path = T1.getPath();
    postInvalidate();
    return true;
}

protected void onDraw(Canvas canvas) {
    canvas.drawPath(path, paint);
}

}

三角形class:

public class三角形{

public int[][] myPoints;
public Path path;
public String myname;
public float[] position;

public Triangle (String name, int[][] newpoints,  float[] posn) {

    myPoints = new int[4][2];
    int i;
    for (i = 0; i < 3; i++) {
        myPoints[i][0] = newpoints[i][0];
        myPoints[i][1] = newpoints[i][1];
    }
    myPoints[3][0] = newpoints[0][0];  // closed circuit for future needs
    myPoints[3][1] = newpoints[0][1];

    path = new Path();
    position = new float[2];
    position[0] =  posn[0];
    position[1] =  posn[1];
    myname = name;
    updatePath();
}

public void setPosition(float[] newPosition){

    position[0] = newPosition[0];
    position[1] = newPosition[1];
    updatePath();
}

public void updatePath(){

    int startx = myPoints[0][0] + Math.round(position[0]);
    int starty = myPoints[0][1] + Math.round(position[1]);

    path.moveTo(startx,starty);
    for (int i = 1; i < myPoints.length; i++)
    {
        int newx = myPoints[i][0] + Math.round(position[0]);
        int newy = myPoints[i][1] + Math.round(position[1]);

        path.lineTo(newx,newy);
    }
    path.close();
}

public Path getPath()   {
    return path;
}

}

主要Activity:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    uk.mydomain.animatedtriangle.GameView gameView = new uk.mydomain.animatedtriangle.GameView(this);
    RelativeLayout relativeLayout = new RelativeLayout(this);
    RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.MATCH_PARENT,
            RelativeLayout.LayoutParams.MATCH_PARENT);
    relativeLayout.setLayoutParams(relativeParams);
    setContentView(relativeLayout);

    relativeLayout.addView(gameView);
}

已排序!只需要在 onDraw 的末尾添加一个 path.reset()。