Android自定义组件在代码中扩展FrameLayout

时间:2011-02-13 01:20:04

标签: android custom-controls android-layout imageview android-custom-view

我想为游戏创建一个Android自定义组件。基本思想是自定义组件的形状为方形,并在其中包含其他方形ImageView组件。内部的ImageView组件可以根据需要进行缩放和/或裁剪,但必须保持方形。行数==列,总是。难度级别确定运行时行和列的确切值。随着游戏变得越来越困难,行数和列数将同等增加,但每个ImageView的缩放大小将相应缩小。我希望组件之间有一些固定的小间距,大多数情况下看起来不错。显示器不可滚动,所有项目必须同时适合显示器。

经过一系列尝试失败后,我感到很沮丧,我不确定制作这个自定义组件的最佳方法是什么。

我最近的想法是大致做到以下几点:

我通过“extends FrameLayout”创建自定义组件类。在我的构造函数中,我在代码中创建了一个任意的小方形ImageView对象。我希望其他人有一天能够重用我的自定义组件,所以我用代码而不是XML来做,这样自定义组件就不依赖于必须定义的任何外部XML drawable。我设置了比例类型,以便ImageView保留它的“方形”(我想我想要fitStart?)。我将方形ImageView的layout_width和layout_height设置为“fill_parent”,因此ImageView填充的空间与包含的FrameLayout中可用的空间一样大。我使用addView()将现在大而方形的ImageView添加到我的布局中。

接下来,我创建一个RelativeLayout对象,并使用addView()以编程方式将其添加到自己。因为我的基类是FrameLayout,我认为这会使RelativeLayout的大小与之前添加的方形ImageView相同。至少那是我阅读文档的方式。

接下来,我测量ImageView以查看它有多大。我不认为我可以衡量自己,因为我以前的尝试都失败了。我的体型一直保持0。我的研究说这是因为我在施工期间无法衡量自己。这变成了Catch-22。当我试图将我的图像缩放到可用空间时,我不能,因为还没有空间可用。我的希望是因为我改为使用FrameLayout作为我的基类并且我将ImageView添加到它,我将能够测量我新创建的和正确缩放的大方形ImageView。

如果一切按计划进行,我现在知道我的RelativeLayout在用户设备上的可用空间有多大,因为它与我的ImageView相同。通过知道有多少空间可用以及需要显示多少行和列,我可以正确地缩放我相应添加的每个ImageView,假设我记得要考虑我添加的ImageView之间的间距。现在我不再需要方形ImageView,如果我想要它可以让它消失。

如果合理,我希望大型ImageView具有圆角,并且每个添加的ImageView也具有圆角。添加ImageViews之间的差距很小,这对于游戏玩法来说看起来很酷。这样我就可以把它留作背景。

这似乎是一个很好的解决方案,并且比我以前没有奏效的尝试更好,但如果有更好的方法......,我正在倾听。

这是一些伪造的代码,基本上与我的理解大致相同:

construct()
{
    ImageView squareImageView = new ImageView(Square);
    LayoutParams squareImageLayoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    squareImageLayoutParams.addRule(fitStart);
    addView(squareImageView, squareImageLayoutParams);

    RelativeLayout relativeLayout = new RelativeLayout(context);
    LayoutParams relativeLayoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    addView(relativeLayout, relativeLayoutParams);

    int size = squareImageView.getWidth(); // Should be the scaled size and square.  
    squareImageView.setVisibility(INVISIBLE); // maybe?

    loop for each row and col
    {
        crop, scale and add each image to the relativeLayout object.  
    }
}

我最基本的问题是,这似乎是一个合理的解决方案吗?如果是这样,ps​​uedocode中有很多东西,我不知道怎么做(还)。

  • 如何在代码中创建小方形ImageView?
  • 如何在代码中设置scaleType?
  • 我是否可以测量我的方形ImageView并获得正确的尺寸?
  • 除了让它变得不可见之外,还有更好的方法来移除方形ImageView吗?
  • 让我的方形ImageView不可见会让它无法衡量吗?
  • 我看到一个名为ShapeDrawable的东西,这会比ImageView更好吗?
  • 如何将ImageView裁剪为方形,将损耗平均分配给双方?

我当然不希望任何人知道所有这些答案,但如果您知道任何可以分享的答案,我将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:0)

有许多内置功能可以正确缩放到可用的屏幕空间。我不完全理解你为什么要衡量ImageView s。

您是否考虑过使用weight?我会尝试固定尺寸GridView(或TableLayoutLinearLayout LinearLayout s。如果内容正确weight,则它们将保持“正方形”。您可以使用verticalSpacing的{​​{1}}或horizontalSpacing属性,也可以将GridView空为空格,以便将View添加到空格中好。

不要设置父元素的weight属性,但要确保元素的权重水平总和垂直等于它们的总和,并且方形ImageViews将始终正确缩放,无论有多少元素你进去了。