Вращение представления в Android - PullRequest
64 голосов
/ 19 декабря 2009

У меня есть кнопка, которую я хочу поставить под углом 45 градусов. По какой-то причине я не могу заставить это работать.

Может кто-нибудь предоставить код для этого?

Ответы [ 9 ]

66 голосов
/ 09 марта 2012

API 11 добавил метод setRotation () для всех представлений.

58 голосов
/ 29 сентября 2011

Вы можете создать анимацию и применить ее к представлению кнопок. Например:

    // Locate view
    ImageView diskView = (ImageView) findViewById(R.id.imageView3);

    // Create an animation instance
    Animation an = new RotateAnimation(0.0f, 360.0f, pivotX, pivotY);

    // Set the animation's parameters
    an.setDuration(10000);               // duration in ms
    an.setRepeatCount(0);                // -1 = infinite repeated
    an.setRepeatMode(Animation.REVERSE); // reverses each repeat
    an.setFillAfter(true);               // keep rotation after animation

    // Aply animation to image view
    diskView.setAnimation(an);
46 голосов
/ 19 декабря 2009

Расширьте класс TextView и переопределите метод onDraw(). Убедитесь, что родительский вид достаточно большой, чтобы обрабатывать повернутую кнопку, не щелкая ее.

@Override
protected void onDraw(Canvas canvas) {
     canvas.save();
     canvas.rotate(45,<appropriate x pivot value>,<appropriate y pivot value>);
     super.onDraw(canvas);
     canvas.restore();

} 
26 голосов
/ 22 ноября 2013

Я просто использовал простую строку в своем коде, и она работает:

myCusstomView.setRotation(45);

Надеюсь, она работает для вас

19 голосов
/ 14 сентября 2015

Одна строка в XML


<View
    android:rotation="45"
    ... />
17 голосов
/ 26 февраля 2014

Применение анимации вращения (без продолжительности, следовательно, без эффекта анимации) является более простым решением, чем вызов метода View.setRotation () или переопределения метода View.onDraw.

// substitude deltaDegrees for whatever you want
RotateAnimation rotate = new RotateAnimation(0f, deltaDegrees, 
    Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);  

// prevents View from restoring to original direction. 
rotate.setFillAfter(true); 

someButton.startAnimation(rotate);
6 голосов
/ 26 марта 2014

Вращающийся вид с rotate() не повлияет на измеренный размер вашего вида. В результате повернутый вид будет обрезан или не уместится в родительский макет. Эта библиотека исправляет это, хотя:

https://github.com/rongi/rotate-layout

enter image description here

6 голосов
/ 04 января 2014

Joininig @ Ответы Руди и @ Пита. Я создал RotateAnimation, которая сохраняет функциональность кнопок даже после поворота.

Метод setRotation () сохраняет функциональность кнопок.

Пример кода:

Animation an = new RotateAnimation(0.0f, 180.0f, mainLayout.getWidth()/2, mainLayout.getHeight()/2);

    an.setDuration(1000);              
    an.setRepeatCount(0);                     
    an.setFillAfter(false);              // DO NOT keep rotation after animation
    an.setFillEnabled(true);             // Make smooth ending of Animation
    an.setAnimationListener(new AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {}

        @Override
        public void onAnimationRepeat(Animation animation) {}

        @Override
        public void onAnimationEnd(Animation animation) {
                mainLayout.setRotation(180.0f);      // Make instant rotation when Animation is finished
            }
            }); 

mainLayout.startAnimation(an);

mainLayout - это поле (LinearLayout)

1 голос
/ 26 декабря 2011

@ Ответ Ichorus является правильным для представлений, но если вы хотите нарисовать повернутые прямоугольники или текст, вы можете сделать следующее в обратном вызове onDraw (или onDispatchDraw) для вашего представления:

(обратите внимание, что theta - это угол от оси x желаемого вращения, pivot - это точка, представляющая точку, вокруг которой мы хотим, чтобы прямоугольник вращался, а horizontalRect - это позиция прямоугольника "до", когда он был повернут)

canvas.save();
canvas.rotate(theta, pivot.x, pivot.y);
canvas.drawRect(horizontalRect, paint);
canvas.restore();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...