Androidで図形を描く方法を見てきましたが、ユーザーが図形に触れると図形を再スケールする方法がわかりました。ユーザーがタッチすると形状が描画され、大きくなる
スクリーンコーナーに四角形を描いているので、タッチすると画面全体にフィットするまで大きくなります。私は、瞬間ではなく、アニメーション化されたトランジションでそれを作りたいと思います。
これを行う方法、または既知のリソースはありますか?
Androidで図形を描く方法を見てきましたが、ユーザーが図形に触れると図形を再スケールする方法がわかりました。ユーザーがタッチすると形状が描画され、大きくなる
スクリーンコーナーに四角形を描いているので、タッチすると画面全体にフィットするまで大きくなります。私は、瞬間ではなく、アニメーション化されたトランジションでそれを作りたいと思います。
これを行う方法、または既知のリソースはありますか?
AndroidにはAnimationsの組み込みサポートが組み込まれています。 Webを検索することで多くの例が見つかります。 This 1つは良いスタートです。
シェイプをタッチ可能にするには、Viewクラスをオーバーライドすることで実装できます(良い例はhereです)。次にView.OnTouchListenerを使用できます。
組み込みのアニメーションは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に設定され、指を上げるまで成長するブール変数を持つことができます。私はこのコードを試していない、それをコンパイルできないかもしれないので、本当に素早くタイプアップしたが、これはあなたが最良の賭けになるだろう。多くの図形を追加し、すべての図形にタッチを検出するのは本当に簡単です。それぞれに異なるエフェクトを追加するなど...私はあなたのためにそれをすべてやりたくはありませんでしたが、これは正しい方向にあなたを指すべきです。
このgithubプロジェクトはあなたを助けるかもしれません:https://github.com/markushi/android-circlebutton
本当に良いスタートです!しかし、私はまだ形状の上でユーザーの接触を検出する方法を知る必要があります。確かに、正方形で作業すると、その境界を保存することができ、ユーザーがどこに触れても境界に入るかどうかを確認できます。どこでも最高の/最も簡単なアプローチであるかどうかはわかりません。それについて何か考えていますか? –
また、これはこれを行うための最もCPU効率の良いソリューションですか?私はそれが非常に低コストのAndroidデバイスで作業する必要があります –
私の編集された答えを参照してください。効率的なソリューションについては、組み込みのソリューションよりも効率的な方法があるとは思えません。 – kgiannakakis