在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()
旋转视图不会影响视图的测量大小。 只有视图的渲染会受到影响,并且结果旋转视图会使其裁剪或不适合父级布局。 这个库修复它:
@ Ichorus的答案是正确的意见,但如果你想绘制旋转的矩形或文本,你可以在你的视图的onDraw(或onDispatchDraw)callback中执行以下操作:
(注意θ是所需旋转的x轴的angular度,pivot是表示我们希望矩形旋转的点的点,而horizontalRect是旋转之前的矩形的位置)
canvas.save(); canvas.rotate(theta, pivot.x, pivot.y); canvas.drawRect(horizontalRect, paint); canvas.restore();