0

我正在寻求减少我的 Android 项目中的冗余代码。让我告诉你我已经拥有的东西。

我有两大主要观点。一种称为 MapView,它是一个包含可以缩放、平移等的位图的 View。另一种称为 StepInfoView,它是一个包含静态数据的 View,例如坐标数组和有关这些坐标的信息。此视图也以与 MapView相同的方式进行缩放和平移,但是,缩放因子和平移量需要独立于 MapView。

StepInfoView 扩展了几个不同的类(总共 6 个),所有这些都需要同步(坐标绘制在一个上,坐标之间的线绘制在另一个上,等等)。

所以,这是我的代码的要点,目前:

public class MapView extends View
{
    protected float scale = 1;

    protected class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener
    {
        @Override
        public boolean onScale(ScaleGestureDetector detector)
        {
            scale *= detector.getScaleFactor());
            return true;
        }

    }

    }
... 

public class StepInfoView extends View
{
    static protected float scale = 1;
    protected class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener
    {
        @Override
        public boolean onScale(ScaleGestureDetector detector)
        {
            scale *= detector.getScaleFactor());
            return true;
        }

    }
}
...
public class StepView extends StepInfoView
{  
    // Custom onDraw, same scale as PathView
}
public class PathView extends StepInfoView
{
    // Custom onDraw, same scale as StepView
}

如您所见, onScales 是相同的。我想创建一个抽象类来保存缩放功能,我们称之为 RootView。MapView 和 StepInfoView 都有比例,但我不能在 RootView 中使比例成为静态,因为 MapView 比例必须独立于 StepInfoView。这是我知道可行的解决方案,但我不喜欢 getter 和 setter 的混乱:

abstract class RootView extends View
{
    abstract protected float getScale();

    abstract protected void setScale(float s);
    protected class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener
    {
        @Override
        public boolean onScale(ScaleGestureDetector detector)
        {
         setScale(getScale() * detector.getScaleFactor());
         return true;
        }
    }
}
...
public class MapView extends RootView
{
    public float scale = 1;
    protected float getScale(){
        return scale;
    }

    protected void setScale(float s){
        scale = s;
    }
}

public class StepInfoView extends RootView
{
    public static float scale = 1;
    protected float getScale(){
        return scale;
    }

    protected void setScale(float s){
        scale = s;
    }
}
public class StepView extends StepInfoView
{  
    // Custom onDraw, same scale as PathView
}
public class PathView extends StepInfoView
{
    // Custom onDraw, same scale as StepView
}

这正是我希望它工作的方式,但再一次,有重复的相同代码(getter 和 setter 以及 MapView 和 StepInfoView 中的“比例”变量)。

我希望我能做的是在 RootView 中声明一个非静态比例并在 StepInfoView 中将其“转换”为静态。这完全不可能……

你能帮帮我吗?

4

3 回答 3

1

一个浮点数大约需要 4 个字节。拥有另一个类将使用比这更多的内存。由于对象通常是 8 字节对齐的,因此它甚至可能不会使对象更小。

如果您想避免复杂性,我会将字段保留为非静态。

你可以有

class RootView {
    protected final float[] scale;

    RootView() {
        scale = new float[] { 1.0f };
    }

    protected RootView(float[] scale) {
        this.scale = scale;
    }

    public boolean onScale(ScaleGestureDetector detector) {
        scale[0] *= detector.getScaleFactor();
        return true;
    }
}

class StepInfoView extends RootView {
    static final float[] scale = { 1.0f };

    StepInfoView() {
        super(scale);
    }
于 2012-08-03T11:35:00.200 回答
0

将 scale 字段移动到 listener,并提供 get 和 set。

在视图中,保留对侦听器的引用,以便您可以访问比例。

对于 MapView,为每个视图实例注册不同的侦听器,以便它们具有不同的比例。

对于 StepInfoView,为每个视图实例注册相同的侦听器,以便它们具有相同的比例。您可以将侦听器的引用存储在静态字段中。

于 2012-08-03T11:37:05.333 回答
0

为什么不将scale字段移入RootView课堂?

更新:刚刚得到它。我认为有一个聚合的地方:为 stepinfoscale值创建一些对象容器,并通过 StepInfoView 传递。

无论如何,我认为最简单的方法是使用吸气剂。

于 2012-08-03T11:34:49.983 回答