Как анимировать заполненный треугольник (нарисованный путем) в Android Studio - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь создать приложение-головоломку для Android, в котором пользователь перемещает многоугольники по экрану с помощью сенсорного события.

Я могу нарисовать, например, треугольник и заполнить его.Я также могу плавно перемещать его по экрану, но он оставляет след, так что экран быстро заполняется :-( Поэтому мне интересно, как настроить метод onDraw, чтобы предыдущие позиции треугольника не были включены. Или естькакая-то другая техника? Вопрос задавался однажды, но не получил удовлетворительного ответа. Я совершенно новичок в работе над Android, поэтому я уверен, что добрый эксперт сможет указать мне правильное направление!

Представление:

открытый класс, который расширяет 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);
}

}

Класс треугольника:

Открытый класс треугольника {

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;
}

}

Основная активность:

открытый класс MainActivity расширяет 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);
}

1 Ответ

0 голосов
/ 30 января 2019

Сортировка!Просто нужно добавить path.reset () в конце onDraw.

...