我需要在活动中的某些计算中使用视图宽度和高度。
在SO Q& A中我看到了
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
this.setMeasuredDimension(parentWidth, parentHeight);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
它有效,但我的问题是:
1)我如何将其传递给活动?
2)或者我应该将我的CustomView作为内部类放入Activity文件中,如下所示
public class MainActivity extends ActionBarActivity {
int parentHeight=0;
int parentWidth=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle aBundle=new Bundle();
MyView myView = new MyView(this);
Binary c=calculateCoordinates();
aBundle.putSerializable("coordinate", c);
myView.setData(aBundle);
myView.setBackgroundColor(Color.WHITE);
setContentView(myView);
}
public Binary calculateCoordinates(){
Random generator = new Random();
Binary c=new Binary();
c.setX(generator.nextInt(parentWidth-1));
c.setY(generator.nextInt(parentHeight-1));
return c;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//int action = event.getAction();
switch (event.getAction()){
case MotionEvent.ACTION_UP:
Intent intent = getIntent();
finish();
startActivity(intent);
break;
}
return true;
}
public class MyView extends View {
Bundle bundle = new Bundle();
Paint paint = new Paint();
public MyView(Context context) {
super(context);
}
@Override
public void onDraw(Canvas canvas) {
paint.setColor(Color.BLACK);
paint.setStrokeWidth(3);
Binary c = (Binary)bundle.getSerializable("coordinate");
canvas.drawRect(c.getX(), c.getY(), c.getX()+1, c.getY()+1, paint);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
parentWidth = MeasureSpec.getSize(widthMeasureSpec);
parentHeight = MeasureSpec.getSize(heightMeasureSpec);
this.setMeasuredDimension(parentWidth, parentHeight);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public void setData(Bundle bundle){
this.bundle=bundle;
}
}
}
但是如果是这样的话我就不知道什么时候准确得到了测量结果,并且如果在调用坐标计算之前已经得到了测量结果。
答案 0 :(得分:0)
一旦将视图放置在您的实际页面上,视图中的OnMeasure
功能就会被调用。
因此,假设您想要在单击某个按钮或其他内容时获取宽度和高度,并希望将这些值传递给另一个活动。
将您的视图放在XML文件中:
<your.namespace.app.MyView
xmlns:app="http://schemas.android.com/apk/res/novoda.tastecard"
android:id="@+id/myView"
android:layout_width="match_parent"
...../>
然后在您的活动中引用您的观看次数:
mMyView = findViewById(R.id.myView);
然后你可以这样做:
int width = myView.getWidth();
int height = myView.getHeight();
那应该返回视图的宽度和高度。
然后执行以下操作以使用您的值调用新活动:
Intent intent = new Intent(this, NewActivity.class);
intent.putExtra("width", width);
intent.putExtra("height", height);
startActivity(intent);
答案 1 :(得分:0)
活动类
将此添加到您的OnCreate代码中。
final ViewTreeObserver obs = myView.getViewTreeObserver();
obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw () {
int height = myView.getHeight();
int width = myView.getWidth();
}
当绘制视图时,将使用正确的宽度和高度调用此函数。