2012-02-09 23 views
0

Androidで図形を描く方法を見てきましたが、ユーザーが図形に触れると図形を再スケールする方法がわかりました。ユーザーがタッチすると形状が描画され、大きくなる

スクリーンコーナーに四角形を描いているので、タッチすると画面全体にフィットするまで大きくなります。私は、瞬間ではなく、アニメーション化されたトランジションでそれを作りたいと思います。

これを行う方法、または既知のリソースはありますか?

答えて

1

AndroidにはAnimationsの組み込みサポートが組み込まれています。 Webを検索することで多くの例が見つかります。 This 1つは良いスタートです。

シェイプをタッチ可能にするには、Viewクラスをオーバーライドすることで実装できます(良い例はhereです)。次にView.OnTouchListenerを使用できます。

+0

本当に良いスタートです!しかし、私はまだ形状の上でユーザーの接触を検出する方法を知る必要があります。確かに、正方形で作業すると、その境界を保存することができ、ユーザーがどこに触れても境界に入るかどうかを確認できます。どこでも最高の/最も簡単なアプローチであるかどうかはわかりません。それについて何か考えていますか? –

+0

また、これはこれを行うための最もCPU効率の良いソリューションですか?私はそれが非常に低コストのAndroidデバイスで作業する必要があります –

+1

私の編集された答えを参照してください。効率的なソリューションについては、組み込みのソリューションよりも効率的な方法があるとは思えません。 – kgiannakakis

1

組み込みのアニメーションはAndroidでうまくいきますが、どの手段でも最も効率的ではありません。パフォーマンスが必須の場合は、独自のメソッドを作成することをお勧めします。私がやることは、Viewを拡張したクラスを作成し、それにバウンディングボックス(Rect/RectF)と円を与えることです。次に、境界ボックスを使用して、円がタッチされたときを検出することができます。

public class Circle extends View { 
    public static final float SCALE_AMOUNT = 1.0f; 
    public RectF boundingBox; 
    private Paint paint; 
    private float circleCenterX, circleCenterY, circleRadius; 
    private float x, y; 

    public Circle(Context context) { 
     super(context); 

     // Create paint 
     paint = new Paint(); 
     paint.setColor(Color.BLACK); 
     paint.setAntiAlias(true); 

     // Set circle start radius 
     circleRadius = 50.0f; 

     // Set start x and y (this is the upper left hand corner) 
     x = 100.0f; 
     y = 100.0f; 

     // Create boundingBox 
     boundingBox = new RectF(); 
     boundingBox.left = x; 
     boundingBox.top = y; 
     boundingBox.right = x + (circleRadius*2); 
     boundingBox.bottom = y + (circleRadius*2); 

     // Set circleCenterX and circleCenterY (the center of the bounding box and circle) 
     circleCenterX = x + circleRadius; 
     circleCenterY = y + circleRadius; 
    } 

    public void scale(boolean scaleUp) { 
     float scaleBy = (scaleUp) ? SCALE_AMOUNT : -SCALE_AMOUNT; 

     // Update circleRadius 
     circleRadius += scaleBy; 

     // Update the bounding box 
     boundingBox.left = x; 
     boundingBox.top = y; 
     boundingBox.right = x + (circleRadius*2); 
     boundingBox.bottom = y + (circleRadius*2); 

     // Update the circle center positions 
     circleCenterX = x + circleRadius; 
     circleCenterY = y + circleRadius; 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     canvas.drawCircle(circleCenterX, circleCenterY, circleRadius, paint); 
    } 

} 

...そして、あなたのActivityクラスでonTouchEvent()メソッドをオーバーライドしてCircleをタッチしたかどうかを確認します。

Circle circle = new Circle(this); 

@Override 
public void onDraw(Canvas canvas) { 
    circle.onDraw(canvas); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    int action = event.getAction(); 
    float x = event.getX(); 
    float y = event.getY(); 

    // Detect if pointer goes down on screen 
    if(action == MotionEvent.ACTION_DOWN) { 
     if(circle.boundingBox.contains(x, y) == true) { 
      // Circle was touched so scale it 
      circle.scale(true); // true is scale up, false is scale down 
     } 
    } 

    return true; 
} 

...これは、タッチするたびにサークル/矩形の縮尺を変更します。継続的に成長させたい場合は、形状をタッチするとtrueに設定され、指を上げるまで成長するブール変数を持つことができます。私はこのコードを試していない、それをコンパイルできないかもしれないので、本当に素早くタイプアップしたが、これはあなたが最良の賭けになるだろう。多くの図形を追加し、すべての図形にタッチを検出するのは本当に簡単です。それぞれに異なるエフェクトを追加するなど...私はあなたのためにそれをすべてやりたくはありませんでしたが、これは正しい方向にあなたを指すべきです。

関連する問題