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

  • Dave Wallace

    Dave Wallace

    27 Kasım 2007
  • hans peder sahl

    hans peder s

    22 Temmuz 2009
  • TechnoBuffalo

    TechnoBuffal

    8 HAZİRAN 2007