绘制一个形状,并在用户触摸时使其变大

时间:2012-02-09 13:43:16

标签: android

我已经看过如何在Android中绘制一个形状,但我想知道的是当用户触摸形状时如何重新缩放形状。

想象一个正方形进入屏幕角落,所以当你触摸它时,它会一直增长直到适合整个屏幕。我希望通过过渡,动画,而不是瞬间实现这一目标。

知道如何做到这一点,或任何已知的资源?

3 个答案:

答案 0 :(得分:1)

Android内置了对Animations的支持。您可以通过搜索Web找到许多示例。 This一个是一个好的开始。

为了使你的形状可以触摸,你可以通过覆盖View类来实现它们(可以找到一个很好的例子here)。然后,您可以使用View.OnTouchListener

答案 1 :(得分: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,直到你拿起你的手指为止。我没有尝试过这段代码,只是快速输入它所以它可能无法编译,但这将是你最好的选择。在所有形状上添加许多形状并检测触摸非常容易。为每个人添加不同的效果......等等。我不想为你做所有这些,但这应该指向正确的方向。

答案 2 :(得分:1)

也许这个github项目可以帮助你:https://github.com/markushi/android-circlebutton