我想创建一个自定义ViewGroup
,其中包含围绕一个圆形按钮旋转的一些ImageButtons。
添加到我的视图组的每个环境ImageButton
都具有相同的布局位置,位于视图组的顶部和水平中心。之后,我将以特定角度旋转它们,目标是围绕中心按钮创建一个环:
public class CustomeView extends ViewGroup {
private List<ArcButton> mArcButtons = new ArrayList<ArcButton>();
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
// ...
mArcBtnBound = new RectF(0, 0, (mInnerRadius + mThickness), mThickness);
mArcBtnBound.offsetTo(
getPaddingLeft() + (mInnerRadius + mThickness) / 2,
getPaddingTop());
for(ArcButton arcBtn: mArcButtons) {
arcBtn.layout(
(int)mArcBtnBound.left,
(int)mArcBtnBound.top,
(int)mArcBtnBound.right,
(int)mArcBtnBound.bottom);
}
}
}
mInnerRadius
是圆心半径按钮,mThickness
是视图组中环境按钮的高度。添加环境ImageButton:
ArcButton btn = new ArcButton(getContext());
btn.setBackgroundResource(bkgResId);
btn.setImageResource(R.drawable.ic_launcher);
addView(btn);
btn.rotateTo(10, (mThickness + mInnerRadius) / 2, (mThickness + mInnerRadius));
我是draw()
类的重新实现ImageButton
方法,用于将图像视图与背景一起旋转,并提供公共方法rotateTo
。
public class ArcButton extends ImageButton {
private float mRotation;
private PointF mPivot;
@Override
public void draw(Canvas canvas) {
canvas.save();
canvas.rotate(mRotation, mPivot.x, mPivot.y);
super.draw(canvas);
canvas.restore();
}
public void rotateTo(float rotation, float pivotX, float pivotY) {
mPivot.x = pivotX;
mPivot.y = pivotY;
mRotation = rotation;
if (Build.VERSION.SDK_INT >= 11) {
this.setPivotX(pivotX);
this.setPivotY(pivotY);
this.setRotation(rotation);
} else {
draw(new Canvas());
}
}
}
正如您可以看到上面的屏幕截图,问题是我的Imagebutton
被截止了。我尝试使用RotateAnimation
,它使旋转的按钮没有被切断,但也没有接收到触摸事件。测试的Android版本是2.2。你能帮我解决这个问题吗?
有效旋转环境按钮的任何其他建议都非常受欢迎。非常感谢你!