在按钮的onClick()中调用具有多个参数的方法

时间:2015-12-06 19:57:18

标签: android android-5.1.1-lollipop

我是Android新手,我正在尝试使用“编辑活动”构建图库应用。我附上了我的应用程序的编辑屏幕截图。有一个ImageView,一个SeekBar和4个ImageButtons。 ImageButtons实现了4种编辑功能 - 亮度,饱和度等。我有各种效果方法。所有我想知道的是当我点击图像按钮(可能是亮度),并拖动搜索条时,亮度应该增加,同样,当我单击对比度图像按钮并拖动搜索条时,图像的对比度应该增加。我该如何实现它。有人可以帮我吧..我尝试使用setOnTouchListener()for ImageButtons,但该dint工作,因为它只接受视图作为参数而不是Bitmap。请帮帮我。谢谢你提前

以下是我的编辑活动

public class EditActivity extends Activity
   {
         private Bitmap bitmap;
         private ImageView image;
         private ImageButton bb,sab,shb,cb;
         private BitmapDrawable drawable;
         private SeekBar seekBar;

         @Override
         public void onCreate( Bundle savedInstanceState)
         {
             super.onCreate(savedInstanceState);
             setContentView(R.layout.filters);


    // Get intent data
    Intent i = getIntent();

    // Selected image id
    final int position = i.getExtras().getInt("id");
    ImageAdapter imageAdapter = new ImageAdapter(this);

    image = (ImageView) findViewById(R.id.imageView);
    image.setImageResource(imageAdapter.ids[position]);


    bb = (ImageButton) findViewById(R.id.brightButton);
    drawable = (BitmapDrawable) image.getDrawable();
    bitmap = drawable.getBitmap();
    bb.setImageBitmap(bitmap);

    sab=(ImageButton)findViewById(R.id.saturationButton);
    drawable = (BitmapDrawable) image.getDrawable();
    bitmap = drawable.getBitmap();
    sab.setImageBitmap(bitmap);

    cb=(ImageButton) findViewById(R.id.contrastButton);
    drawable = (BitmapDrawable) image.getDrawable();
    bitmap = drawable.getBitmap();
    cb.setImageBitmap(bitmap);

    shb=(ImageButton) findViewById(R.id.sharpButton);
    drawable = (BitmapDrawable) image.getDrawable();
    bitmap = drawable.getBitmap();
    shb.setImageBitmap(bitmap);


    SeekBar seekBar=(SeekBar)findViewById(R.id.seekBar);
    seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
    {
        int brightness;

        @Override
        public void onStopTrackingTouch(SeekBar arg0) {


        }

        @Override
        public void onStartTrackingTouch(SeekBar arg0) {


        }

        @Override
        public void onProgressChanged(SeekBar arg0, final int progress, boolean arg2)
        {
            brightness = progress;


                    Bitmap bBitMap = brightClicked(bitmap,progress);
                    image.setImageBitmap(bBitMap);
                    Bitmap saBitMap = sharpClicked(bitmap,progress);
                    image.setImageBitmap(saBitMap);
                    Bitmap cBitMap = saturationClicked(bitmap,progress);
                    image.setImageBitmap(cBitMap);
                    Bitmap shBitMap = contrastClicked(bitmap,progress);
                    image.setImageBitmap(shBitMap);

        }
    });


}



public Bitmap brightClicked(Bitmap bbitmap,int value)
{

    Bitmap bmOut= Bitmap.createBitmap(bbitmap.getWidth(), bbitmap.getHeight(),bbitmap.getConfig());
    int A, R, G, B;
    int pixel;

    for(int i=0; i<bbitmap.getWidth(); i++){
        for(int j=0; j<bbitmap.getHeight(); j++)
        {
            pixel = bbitmap.getPixel(i, j);
            A = Color.alpha(pixel);
            R = Color.red(pixel);
            G = Color.green(pixel);
            B = Color.blue(pixel);
            R += value;
            if (R > 255)
            {
                R = 255;
            } else if (R < 0)
            {
                R = 0;
            }
            G += value;
            if (G > 255)
            {
                G = 255;
            } else if (G < 0)
            {
                G = 0;
            }
            B += value;
            if (B > 255)
            {
                B = 255;
            } else if (B < 0)
            {
                B = 0;
            }
            bmOut.setPixel(i, j, Color.argb(A, R, G, B));
        }
    }
    return bmOut;
}// and other methods of effects like sharpness,contrast..

以下是Screenshot of EditImage

1 个答案:

答案 0 :(得分:0)

我将从定义状态开始,以便SeekBar可以快速确定应该修改哪个属性(对比度,亮度,清晰度,饱和度)。如果您愿意,可以将这些内容投入枚举类(Google建议避免使用enums in Android),或者在类本身中将它们定义为整数。例如:

public class EditActivity extends Activity {
    private int currentState;
    private static final int SATURATE = 0;
    private static final int CONTRAST = 1;
    ....
}

现在您可以根据点击的按钮更新状态:

bb = (ImageButton) findViewById(R.id.brightButton);
bb.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          currentState = BRIGHTNESS;
      }
}

然后使用switch-case语句快速确定Activity的状态,并通过图像方法相应地调整图像。

seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
{
    @Override
    public void onProgressChanged(SeekBar arg0, final int progress, boolean arg2)
    {
        brightness = progress;
        switch (currentState) {
               case (SATURATE) : 
                     image.setImageBitmap(saturationClicked(bitmap,progress));
                     break;
               case (CONTRAST) :
                     image.setImageBitmap(contrastClicked(bitmap,progress));
                     break;

看起来你的当前实现会在搜索栏移动时在图像上运行所有过滤器,我想这会导致可怕的性能。一个开关盒可以帮助你避免这种情况。