访问自定义视图中的标准布局属性
问题描述:
我想从传递给我的自定义视图的构造函数的标准属性中拉出宽度规格和高度规范,以便我可以调整它们并作为新的布局窗体返回,以便当我要显示视图在活动锁中旋转为纵向。访问自定义视图中的标准布局属性
我无法找到intarray中需要传递的静态int值来获取这些原始值。他们在哪?
public static final int[] stdatts = {valForandroid:layout_width,...height,...gravity};
TypedArray natts = getContext().getResources().obtainAttributes(attrs, stdatts);
int widset = natts.getInteger(valForandroid:layout_width, 0);
int hitset = ....;
int gravset = .....;
if (orientIsV)
FrameLayout.LayoutParams reset = new FrameLayout.LayoutParams (widset, hitset, gravset);
else
FrameLayout.LayoutParams reset = new FrameLayout.LayoutParams (hitset, widset, gravset);
我可以通过查看属性阵列我居然获得通过,在发现这些容易足够的价值,但这显然是一个非常肮脏的和不可靠的修复
答
不太答案我希望 - 我给试图以这种方式处理这个问题 - 数据格式非常难以理解。这里是旋转的扩展relativelayout类的代码的一部分,保持其中的所有内容不变,它也保持左/右对齐正确并正确处理触摸事件。例如,它将允许嵌套的Seekbar处于任何方向,避免需要特殊情况下的seekbar。
public void setOrientation() {
if (rSource == RotateSetBy.globalStatic) {
currRotate = PootleViewExtras.deviceOrient;
}
boolean isVert = currRotate == Orientations.up || currRotate == Orientations.down;
if (lockSize > 0 && widthAtt < 0 && heightAtt < 0) {
int lws = 0;
int lhs = 0;
if (isVert) {
lws = widthAtt;
lhs = heightAtt;
} else {
lhs = widthAtt;
lws = heightAtt;
}
int setgrav = gravityAtt & 0x11; // messy but seems to do the right things
if (currRotate == Orientations.down) {
if ((gravityAtt & 0x2) != 0) setgrav |= 0x4;
if ((gravityAtt & 0x4) != 0) setgrav |= 0x2;
if ((gravityAtt & 0x20) != 0) setgrav |= 0x40;
if ((gravityAtt & 0x40) != 0) setgrav |= 0x20;
} else {
setgrav = gravityAtt;
}
FrameLayout.LayoutParams reset = new FrameLayout.LayoutParams (lws, lhs, setgrav);
this.setLayoutParams(reset);
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
boolean isVert = currRotate == Orientations.up || currRotate == Orientations.down;
if (isVert) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
lastWidth = this.getMeasuredWidth();
lastHeight = this.getMeasuredHeight();
} else {
super.onMeasure(heightMeasureSpec, widthMeasureSpec);
lastHeight = this.getMeasuredWidth();
lastWidth = this.getMeasuredHeight();
}
setMeasuredDimension(lastWidth,lastHeight);
switch (currRotate) {
case up:
mForward.reset();
mForward.postRotate(0);
mForward.invert(mReverse);
break;
case right:
mForward.reset();
mForward.postRotate(90,lastWidth/2,lastWidth/2);
mForward.invert(mReverse);
break;
case down:
mForward.reset();
mForward.postRotate(180,lastWidth/2,lastHeight/2);
mForward.invert(mReverse);
break;
case left:
mForward.reset();
mForward.postRotate(-90,lastHeight/2,lastHeight/2);
mForward.invert(mReverse);
break;
}
}
@Override
protected void dispatchDraw(Canvas canvas) {
if (currRotate == Orientations.up) {
super.dispatchDraw(canvas);
} else {
canvas.save();
canvas.concat(mForward);
super.dispatchDraw(canvas);
canvas.restore();
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
// if (currRotate == Orientations.up){
// return super.dispatchTouchEvent(event);
// } else {
final float[] temp = mTemp;
temp[0] = event.getX();
temp[1] = event.getY();
mReverse.mapPoints(temp);
event.setLocation(temp[0], temp[1]);
return super.dispatchTouchEvent(event);
// }
这并不完全正常 - 在有限的情况下,它可以正常工作。看来,各种代码不能正确使用画布来计算位置,所以它看起来像需要另一种方法.... – pootle 2012-08-20 22:48:23