1

私は、画像に画像効果を生成する Android アプリに取り組んでいます。以下は私のアプリのスナップショットです:

ご覧のとおり、下部には水平スクロールバーがあり、ユーザーが水平スクロールバーの画像の 1 つに触れると、同じ効果が上の画像に適用されます。

合計 26 個の画像効果があるため、水平スクロールバーに 26 個の画像があります。さて、私のコードでは、これらすべての画像を見つけて、それらのonClickListener()を 1 つの特定のリスナーに設定する必要があります。

私は次の方法でタスクを達成しています:

    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ループまたは同様のものは、私を大いに助けるかもしれません!

4

3 に答える 3

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」は、これらの画像ボタンを含むビュー (LinearLayout を推測しますか?) の ID です。その ViewGroup に、このリスナーをアタッチする ImageViews 以外の他の子が含まれている場合、これは問題を引き起こすことに注意してください。

于 2013-05-04T16:50:53.373 に答える
2

反復しArrays.asList(obj1, obj2, obj3...)て、for ループで 1 回実行します。

于 2013-05-04T16:36:53.887 に答える
1

水平スクロール ビューよりも ViewPager を使用したほうがよい場合があります。ViewPager ソリューションを使用する利点は、実行時にビューをリサイクルしてそこにプロパティを設定できることです。

これの典型的な設定は次のとおりです。

  • レイアウトで宣言された ViewPager
  • 各画像設定に関連するすべてを保持するある種のモデル クラス
  • 3 つの画像ビューまたはドローアブルを含むラジオ ボタン グループなどを保持できるフラグメント
  • フラグメントとモデルの配列リストを含む PagerAdapter

より多くのコードのように見えますが、データを変更したり、リファクタリングを行ったりするときは、間違いなくより拡張可能です。また、アイテムを変更すると、クールな Android ページ「swoosh」も表示されます。

参照: http://developer.android.com/training/implementing-navigation/lateral.html#horizo​​ntal-paging

于 2014-05-22T19:06:24.230 に答える