我正在寻求减少Android项目中的冗余代码。让我告诉你我已有的东西。
我有两组主要观点。一个称为MapView,它是一个包含可以缩放,平移等位图的视图。另一个称为StepInfoView,它是一个包含静态数据的视图,例如坐标数组和有关这些坐标的信息。此视图也以与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。这是一个我知道可行的解决方案,但我不喜欢吸气剂和制定者的混乱:
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中的“scale”变量)。
我希望我能做的是在RootView中声明一个非静态比例,并在StepInfoView中将其“转换”为静态。那不太可能......
你能帮助我吗?
答案 0 :(得分: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);
}
答案 1 :(得分:0)
为什么不将scale
字段移到RootView
类?
更新:刚刚搞定了。我认为有一个聚合的地方:为stepinfo scale
创建一些对象容器,并通过StepInfoView传递。
无论如何,我认为使用getter是最简单的方式。
答案 2 :(得分:0)
将scale字段移动到侦听器,并提供get和set。
在视图中,保留对侦听器的引用,以便您可以访问该比例。
对于MapView,为每个视图实例注册一个不同的侦听器,以便它们具有不同的比例。
对于StepInfoView,为每个视图实例注册相同的侦听器,以使它们具有相同的比例。您可以将侦听器的引用存储在静态字段中。