SORU
27 Kasım 2011, Pazar


Parmağınızı aşağıdaki düz bir çizgi çizmek için Nasıl Android

http://marakana.com/tutorials/android/2d-graphics-example.html

Aşağıda bu örneği kullanıyorum. Ama ben parmaklarımı ekranda çok hızlı hareket satırı tek tek nokta döner.

Çizimi hızlandırmak miyim, emin değilim. Ya da düz bir çizgi ile iki son puan temasa geçeyim. Bu iki çözüm ikinci çok hızlı parmağınızı hareket ne zaman düz bir çizgi sonra keskin eğrileri uzun bölümler olacak dışında iyi bir seçenek gibi görünüyor.

Eğer başka çözümler varsa onları duymak harika olurdu.

Önceden herhangi bir yardım için teşekkürler.

CEVAP
27 Kasım 2011, Pazar


Kolay bir çözümü de belirtildiği gibi, sadece düz bir çizgi ile noktalar bağlamak için. İşte bunu yapmak için kod:

public void onDraw(Canvas canvas) {
    Path path = new Path();
    boolean first = true;
    for(Point point : points){
        if(first){
            first = false;
            path.moveTo(point.x, point.y);
        }
        else{
            path.lineTo(point.x, point.y);
        }
    }
    canvas.drawPath(path, paint);
}

strok için dolgu boya değiştirmek emin olun:

paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(2);
paint.setColor(Color.WHITE);

Başka bir seçenek quadTo yöntemi kullanarak: iterpolation ile puan bağlayın

public void onDraw(Canvas canvas) {
    Path path = new Path();
    boolean first = true;
    for(int i = 0; i < points.size(); i  = 2){
        Point point = points.get(i);
        if(first){
            first = false;
            path.moveTo(point.x, point.y);
        }

        else if(i < points.size() - 1){
            Point next = points.get(i   1);
            path.quadTo(point.x, point.y, next.x, next.y);
        }
        else{
            path.lineTo(point.x, point.y);
        }
    }

    canvas.drawPath(path, paint);
}

Bu hala bazı keskin kenarları olur.

Eğer gerçekten iddialı iseniz, aşağıdaki gibi kübik eğriler hesaplamak için başlayabilirsiniz

public void onDraw(Canvas canvas) {
    Path path = new Path();

    if(points.size() > 1){
        for(int i = points.size() - 2; i < points.size(); i  ){
            if(i >= 0){
                Point point = points.get(i);

                if(i == 0){
                    Point next = points.get(i   1);
                    point.dx = ((next.x - point.x) / 3);
                    point.dy = ((next.y - point.y) / 3);
                }
                else if(i == points.size() - 1){
                    Point prev = points.get(i - 1);
                    point.dx = ((point.x - prev.x) / 3);
                    point.dy = ((point.y - prev.y) / 3);
                }
                else{
                    Point next = points.get(i   1);
                    Point prev = points.get(i - 1);
                    point.dx = ((next.x - prev.x) / 3);
                    point.dy = ((next.y - prev.y) / 3);
                }
            }
        }
    }

    boolean first = true;
    for(int i = 0; i < points.size(); i  ){
        Point point = points.get(i);
        if(first){
            first = false;
            path.moveTo(point.x, point.y);
        }
        else{
            Point prev = points.get(i - 1);
            path.cubicTo(prev.x   prev.dx, prev.y   prev.dy, point.x - point.dx, point.y - point.dy, point.x, point.y);
        }
    }
    canvas.drawPath(path, paint);
}

Ayrıca, aşağıdaki yinelenen hareket olayları önlemek için değiştirmeniz gerekli buldum:

public boolean onTouch(View view, MotionEvent event) {
    if(event.getAction() != MotionEvent.ACTION_UP){
        Point point = new Point();
        point.x = event.getX();
        point.y = event.getY();
        points.add(point);
        invalidate();
        Log.d(TAG, "point: "   point);
        return true;
    }
    return super.onTouchEvent(event);
}

ve Point sınıfı için dx ve dy değerlerini ekleyin:

class Point {
    float x, y;
    float dx, dy;

    @Override
    public String toString() {
        return x   ", "   y;
    }
}

Bu düz çizgileri üretir, ama bazen nokta bir döngü kullanarak bağlayın. Ayrıca, uzun çizim oturumları için, bu hesaplama hesaplamak için yoğun hale gelir.

... Eğlenceli şeyler ile oynamak için yardımcı olur umarım.

Edit

Birlikte hızlı bir proje bu farklı teknikler, Square suggessted imza uygulaması da dahil olmak üzere gösteren attım. Keyfini çıkarın: https://github.com/johncarl81/androiddraw

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GavinMichaelBooth

    GavinMichael

    26 AĞUSTOS 2006
  • ICON

    ICON

    19 EKİM 2011
  • SolidWorksTutoriels

    SolidWorksTu

    14 Kasım 2013