在 FrameLayout 中的自定义视图上以编程方式设置边距值

Posted

技术标签:

【中文标题】在 FrameLayout 中的自定义视图上以编程方式设置边距值【英文标题】:Set programmatically margin values on a custom view in a FrameLayout 【发布时间】:2011-08-17 13:55:41 【问题描述】:

我定义了一个视图。该视图包含一张图片,用户可以与之交互。我在我的主布局中定义了一个 FrameLayout,并以编程方式在这个 FrameLayout 中添加了这个视图。

在 View 构造函数中,我定义了一个 MarginLayutParams 以将此视图放在屏幕的中心。代码是:

mLayoutParams = new MarginLayoutParams(picture.getWidth(), picture.getHeight);
mLayoutParams.setMargins(toCenterX, toCenterY, 0, 0);
setLayoutParams(mLayoutParams);

边距值不起作用...视图已正确调整为定义的宽度和高度,但视图未按边距值缩放到视图的中心...

编辑:

我的观点架构:

                         -> View1 (i want sclae this view to the center)
Activity -> FrameLayout  -> View2 (i want scale this view under the view 1)
                         -> View3 (i want scale this view at the top right)

这是我的 ViewGroup 的示例。我实现了一个 ViewGroup 来管理所有视图:

public class MainView extends ViewGroup 

public BackgroundView mBackgroundWheelArea;
public BackgroundView mBackgroundLabelArea;
public WheelCoreView wheelCoreArea;
public LabelView labelArea;

public WheelOfFortuneActivity mActivity;

public MainView(Context pContext) 
    super(pContext);
    mActivity = (WheelOfFortuneActivity) pContext;
    mBackgroundWheelArea = new BackgroundView(pContext, R.drawable.menu_background);
    wheelCoreArea = new WheelCoreView(pContext, mActivity.fromPixelToDp(mBackgroundWheelArea
            .getBackgroundHeight()), mActivity.fromPixelToDp(mBackgroundWheelArea
            .getBackgroundWidth()));
    labelArea = new LabelView(pContext, "Web");
    mBackgroundLabelArea = new BackgroundView(pContext, R.drawable.menu_background_label);
    this.addView(wheelCoreArea, 0);


@Override
protected void onLayout(boolean pChanged, int pL, int pT, int pR, int pB) 
    final int count = getChildCount();
    for (int i = 0; i < count; i++) 
        View child = getChildAt(i);
        child.layout(100, 100, 0, 0);
    



@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) 
    child.draw(canvas);
    return true;



但是wheelCoreArea 视图从左上角没有移动! :(

你能帮帮我吗?

问候。

【问题讨论】:

做child.layout(100, 100, 100+child.getWidth(), 100+child.getHeight()); @user7777777777 什么也没发生,我的视图停留在左上角... 我已经修改了我的答案。应该工作。 我在自定义视图或 ViewGroup 中使用 onDraw() ? @user7777777777 可能是因为我使用 FrameLayout 来定义主视图?如果我使用RelativeLayout,它可以工作。 【参考方案1】:

您应该重写 onLayout() 方法并手动设置视图边界,而不是设置边距。

调用view.layout(top, left, right, bottom);维护成员变量的边界。

如果此视图的大小也发生变化,您可能还需要重写 onMeasure 方法。

编辑

试试这个公式来计算视图放置点。

viewLeft = displayWidth()/2 - viewWidth/2;
viewTop = displayHeight()/2 - viewHeight/2;

致电view.layout(viewLeft , viewTop , viewLeft + viewWidth, viewTop + viewHeight);

【讨论】:

你必须重写 onMeasure 方法吗? 一个问题:我在我的 FrameLayout 上覆盖 onLayout() 然后我迭代所有的孩子并调用 view.layout(top, left, right, bottom);每个? 我正在测试,我暂时不覆盖 onMeasure。 所以,我的活动中没有 onLayout 方法。如果我在我看来覆盖了这个,我没有孩子(见我在第一篇文章中的编辑)。我必须添加一个包含所有视图的视图? 你可以在帖子中添加快照吗.. 如何计算 centerX 和 centerY

以上是关于在 FrameLayout 中的自定义视图上以编程方式设置边距值的主要内容,如果未能解决你的问题,请参考以下文章

FrameLayout中的Android中心视图不起作用

响应选择器的自定义可检查视图

当相机在Android中的表面视图上以编程方式截屏

Android子视图高度与ListView项目中的父级不匹配

如何在 iOS 上以编程方式创建选项卡视图

以编程方式获取嵌入在 UIStackView 中的自定义 UIView