我正在开发一款能够在图像上生成图像效果的Android应用。 以下是我的应用程序的快照:
如您所见,在底部 - 有一个水平滚动条,当用户触摸水平滚动条上的一个图像时,对上面的图像应用相同的效果。
我总共有26个图像效果,因此在水平滚动条中有26个图像。现在,在我的代码中,我将找到所有这些图像,并将 onClickListener()设置为一个特定的侦听器。
我正在通过以下方式完成任务:
sepiaGreenishImage = (ImageView) findViewById(R.id.sepiaGreenish);
embossImage = (ImageView) findViewById(R.id.emboss);
sharpenImage = (ImageView) findViewById(R.id.sharpen);
slightYellowishImage = (ImageView) findViewById(R.id.ligth_yellow);
slightBluishImage = (ImageView) findViewById(R.id.light_blue);
slightReddishImage = (ImageView) findViewById(R.id.light_red);
slightGreenishImage = (ImageView) findViewById(R.id.light_green);
negativeImage = (ImageView) findViewById(R.id.negative);
greyScaleImage = (ImageView) findViewById(R.id.greyscale);
tintSeventyImage = (ImageView) findViewById(R.id.tint_at_70);
tintThirtyImage = (ImageView) findViewById(R.id.tint_at_30);
snowImage = (ImageView) findViewById(R.id.snow);
darkImage = (ImageView) findViewById(R.id.darken);
noiseImage = (ImageView) findViewById(R.id.noise);
flipImage = (ImageView) findViewById(R.id.flip);
rotateImage = (ImageView) findViewById(R.id.rotate);
gaussianBlurImage = (ImageView) findViewById(R.id.blur);
reddishImage = (ImageView) findViewById(R.id.reddish);
bluishImage = (ImageView) findViewById(R.id.bluish);
greenishImage = (ImageView) findViewById(R.id.greenish);
blackFilterImage = (ImageView) findViewById(R.id.black_filter);
increasedSepiaImage = (ImageView) findViewById(R.id.increased_sepia);
spiaBluishImage = (ImageView) findViewById(R.id.sepia_bluish);
brightImage = (ImageView) findViewById(R.id.brighten);
mirrorImage = (ImageView) findViewById(R.id.mirror);
然后以下方式,我设置onClickListener:
sepiaGreenishImage.setOnClickListener(this);
embossImage.setOnClickListener(this);
sharpenImage.setOnClickListener(this);
slightYellowishImage.setOnClickListener(this);
slightBluishImage.setOnClickListener(this);
slightReddishImage.setOnClickListener(this);
slightGreenishImage.setOnClickListener(this);
negativeImage.setOnClickListener(this);
greyScaleImage.setOnClickListener(this);
tintSeventyImage.setOnClickListener(this);
tintThirtyImage.setOnClickListener(this);
snowImage.setOnClickListener(this);
darkImage.setOnClickListener(this);
noiseImage.setOnClickListener(this);
flipImage.setOnClickListener(this);
rotateImage.setOnClickListener(this);
gaussianBlurImage.setOnClickListener(this);
reddishImage.setOnClickListener(this);
bluishImage.setOnClickListener(this);
greenishImage.setOnClickListener(this);
blackFilterImage.setOnClickListener(this);
increasedSepiaImage.setOnClickListener(this);
spiaBluishImage.setOnClickListener(this);
brightImage.setOnClickListener(this);
mirrorImage.setOnClickListener(this);
现在,我的问题是如何应用任何类型的重构?因为我经常重复自己。任何类型的 foreach 循环或类似的东西都可能对我有所帮助!
答案 0 :(得分:4)
要以编程方式执行此操作,您可以执行以下操作:
ViewGroup buttonGroup = (ViewGroup) findViewById(R.id.image_effect_buttons);
for (int i = 0; i < buttonGroup.getChildCount(); i++) {
ImageView imageView = (ImageView) buttonGroup.getChildAt(i);
imageView.setOnClickListener(this);
}
其中“image_effect_buttons”是任何视图的id(猜测一个LinearLayout?)包含那些图像按钮。请注意,如果ViewGroup包含除了要将此侦听器附加到的ImageView之外的任何其他子节点,这将导致问题,但这是避免显式枚举它们的最简单方法。
答案 1 :(得分:2)
迭代Arrays.asList(obj1, obj2, obj3...)
并在for循环中执行一次。
答案 2 :(得分:1)
使用ViewPager和水平滚动视图可能会更好。使用ViewPager解决方案的优势在于您可以在运行时回收视图并设置其属性。
典型的设置包括:
似乎有更多代码,但在更改数据或进行任何重新分解时,它肯定更具可扩展性。你也可以在更换项目时获得很酷的android页面“swoosh”。
参考:http://developer.android.com/training/implementing-navigation/lateral.html#horizontal-paging