У меня есть кнопка, которую я хочу поставить под углом 45 градусов. По какой-то причине я не могу заставить это работать.
Может кто-нибудь запросит код для этого?
У меня есть кнопка, которую я хочу поставить под углом 45 градусов. По какой-то причине я не могу заставить это работать.
Может кто-нибудь запросит код для этого?
API 11 добавил метод setRotation() ко всем представлениям.
Вы можете создать анимацию и применить ее к виду на панели. Например:
// 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 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);
Расширьте класс 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();
}
Я просто использовал простую строку в своем коде, и она работает:
myCusstomView.setRotation(45);
Надеюсь, это сработает для вас.
Применение анимации вращения (без продолжительности, без эффекта анимации) является более простым решением, чем вызов метода 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);
Одна строка в XML
<View
android:rotation="45"
... />
Ответы Joininig @Rudi и @Pete. Я создал 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)
Вращающийся вид с rotate()
не повлияет на размер измеренного размера. Возникает только просмотр рендеринга, и в результате вращающееся представление сделает его обрезанным или не вписывается в родительский макет. Эта библиотека исправляет это, хотя:
https://github.com/rongi/rotate-layout
@Ichorus ответ правильный для просмотров, но если вы хотите нарисовать повернутые прямоугольники или текст, вы можете сделать следующее в обратном вызове onDraw (или onDispatchDraw) для вашего представления:
(обратите внимание, что theta - это угол от оси x желаемого вращения, ось вращения - точка, которая представляет точку, вокруг которой мы хотим, чтобы прямоугольник вращался, а horizontalRect - прямое положение "до того, как оно было повернуто)
canvas.save();
canvas.rotate(theta, pivot.x, pivot.y);
canvas.drawRect(horizontalRect, paint);
canvas.restore();