在Android中旋转视图

我有一个我想要放在45度angular的button。 出于某种原因,我无法得到这个工作。

有人可以提供代码来完成这个?

你可以创build一个animation并将其应用到你的button视图。 例如:

// 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); 

API 11为所有视图添加了setRotation()方法。

扩展TextView类并重写onDraw()方法。 确保父视图足够大来处理旋转的button而不剪裁它。

 @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); 

希望对你有效。

应用旋转animation(无持续时间,因此没有animation效果)比调用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's和@ Pete的回答。 我创build了一个RotateAnimation,在旋转后也保持button的function。

setRotation()方法保留buttonfunction。

代码示例:

 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)callback中执行以下操作:

(注意θ是所需旋转的x轴的angular度,pivot是表示我们希望矩形旋转的点的点,而horizo​​ntalRect是旋转之前的矩形的位置)

 canvas.save(); canvas.rotate(theta, pivot.x, pivot.y); canvas.drawRect(horizontalRect, paint); canvas.restore();