2015-11-29 38 views
1

我正在使用最新的Android IDE。我在我的用戶界面中有一個吸管圖標,讓用戶從應用程序拋出的位圖中選擇一種顏色。我在圖標上設置了一個監聽器,但我無法找到讓它等待下一次觸摸的方法,從中可以計算出像素顏色。這是簡單的代碼至今:android java從ImageView中挑選顏色

//Open the eyedropper 
    dropBtn = (ImageButton) findViewById(R.id.drop_btn); 
    dropBtn.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
       Toast toast = Toast.makeText(getApplicationContext(), colPickMsg, Toast.LENGTH_SHORT); 
       toast.show(); 

       float x = event.getX(); 
       float y = event.getY(); 

       switch (event.getAction()) { 

        case MotionEvent.ACTION_DOWN: 

         p1.x = (int) x; 
         p1.y = (int) y; 

         final int sourceColor = drawView.drawableBitmap.getPixel((int) x, (int) y); 
       } 
      } 
      return true; 
     } 
    }); 

的問題是代碼只是通過爆炸,並報告上的像素是一個在選擇滴管圖標。我需要代碼等待下一次點擊並報告。所有建議都將受到重視。

下面是繪圖視圖的代碼。

package com.softwareandgeneral.drawtutorial01; 

import android.app.ProgressDialog; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.Point; 
import android.graphics.PorterDuff; 
import android.graphics.PorterDuffXfermode; 
import android.graphics.Rect; 
import android.util.AttributeSet; 
import android.util.TypedValue; 
import android.view.MotionEvent; 
import android.view.View; 

public class DrawingView extends View { 

    //drawing path 
    private Path drawPath; 
    //drawing and canvas paint 
    private Paint drawPaint, canvasPaint; 
    //initial color 
    private int paintColor = 0xFF660000; 
    //canvas 
    private Canvas drawCanvas; 
    //canvas bitmap 
    public Bitmap canvasBitmap, drawableBitmap; 
    //brush sizes 
    private float brushSize, lastBrushSize; 
    //erase flag 
    private boolean erase = false, paint_mode = false; 

    final Point p1 = new Point(); 
    private Path path; 

    public DrawingView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setupDrawing(); 
    } 

    //setup drawing 
    private void setupDrawing() { 

     //prepare for drawing and setup paint stroke properties 
     brushSize = getResources().getInteger(R.integer.medium_size); 
     lastBrushSize = brushSize; 
     drawPath = new Path(); 
     drawPaint = new Paint(); 
     drawPaint.setColor(paintColor); 
     drawPaint.setAntiAlias(true); 
     drawPaint.setStrokeWidth(brushSize); 
     drawPaint.setStyle(Paint.Style.STROKE); 
     drawPaint.setStrokeJoin(Paint.Join.ROUND); 
     drawPaint.setStrokeCap(Paint.Cap.ROUND); 
     canvasPaint = new Paint(Paint.DITHER_FLAG); 
    } 

    //size assigned to view 
    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
     canvasBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.doodle_01); 
     drawableBitmap = canvasBitmap.copy(Bitmap.Config.ARGB_8888, true); 
     drawCanvas = new Canvas(drawableBitmap); 
    } 

    //draw the view - will be called after touch event 
    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawBitmap(drawableBitmap, 0, 0, canvasPaint); 
     canvas.drawPath(drawPath, drawPaint); 
    } 

    //update color 
    public void setColor(String newColor) { 
     invalidate(); 
     paintColor = Color.parseColor(newColor); 
     drawPaint.setColor(paintColor); 
    } 

    //set brush size 
    public void setBrushSize(float newSize) { 
     float pixelAmount = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
       newSize, getResources().getDisplayMetrics()); 
     brushSize = pixelAmount; 
     drawPaint.setStrokeWidth(brushSize); 
    } 

    //get and set last brush size 
    public void setLastBrushSize(float lastSize) { 
     lastBrushSize = lastSize; 
    } 

    public float getLastBrushSize() { 
     return lastBrushSize; 
    } 

    //set erase true or false 
    public void setErase(boolean isErase) { 
     erase = isErase; 
     if (erase) drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
     else drawPaint.setXfermode(null); 
    } 

    //start new drawing 
    public void startNew() { 
     drawCanvas.drawColor(0, PorterDuff.Mode.CLEAR); 
     invalidate(); 
    } 

    // JRL: function to return current paint color 
    public int getPaintColor() { 
     return drawPaint.getColor(); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     if (paint_mode) { 
      float touchX = event.getX(); 
      float touchY = event.getY(); 
      //respond to down, move and up events 
      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        drawPath.moveTo(touchX, touchY); 
        break; 
       case MotionEvent.ACTION_MOVE: 
        drawPath.lineTo(touchX, touchY); 
        break; 
       case MotionEvent.ACTION_UP: 
        drawPath.lineTo(touchX, touchY); 
        drawCanvas.drawPath(drawPath, drawPaint); 
        drawPath.reset(); 
        break; 
       default: 
        return false; 
      } 
      //redraw 
      invalidate(); 
      return true; 

     } else { 

      float x = event.getX(); 
      float y = event.getY(); 

      switch (event.getAction()) { 

       case MotionEvent.ACTION_DOWN: 

        p1.x = (int) x; 
        p1.y = (int) y; 
        final int sourceColor = drawableBitmap.getPixel((int) x, (int) y); 
        final int targetColor = drawPaint.getColor(); 
        new TheTask(drawableBitmap, p1, sourceColor, targetColor).execute(); 
        invalidate(); 
      } 
      return true; 
     } 
    } 

} 

這越來越接近了。我實現了在MainActivity.onClick(查看視圖)onTouch聽者按照這段代碼:

else if (view.getId() == R.id.drop_btn) { 
     //JRL: color picker button clicked 
     Toast toast = Toast.makeText(getApplicationContext(), colPickMsg, Toast.LENGTH_SHORT); 
     toast.show(); 

     drawView.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        float x = event.getX(); 
        float y = event.getY(); 

        switch (event.getAction()) { 
         case MotionEvent.ACTION_DOWN: 
          p1.x = (int) x; 
          p1.y = (int) y; 
          final int sourceColor = drawView.drawableBitmap.getPixel((int) x, (int) y); 
          currPaint.setBackgroundColor(sourceColor); 
          String hexColor = String.format("#FF%06X", (0xFFFFFF & sourceColor)); 
          currPaint.setTag(hexColor); 
          drawView.setColor(hexColor); 
        } 
       } 
       return true; 
      } 
     }); 
    } 

和工作原理。我可以選擇一種顏色,對UI的更改工作正常。不起作用的是我被困在這個監聽器中 - 我想回到原來的onTouchEventlistener。我還沒有找到一種方法來阻止Android中的偵聽器。

+0

不dropButton保持與色彩的形象呢? – Gi0rgi0s

+0

不是。圖像處於單獨視圖中。如果你能解釋你的意思,我可以改變它。 –

+0

請發佈單獨視圖的代碼 – Gi0rgi0s

回答

0

我認爲你有它倒退。問題在於OnTouchListener的意思是「當有東西碰到我時,當我觸摸某物時,做到這一點,而不是」,做到這一點。「

聽者看起來不錯,但是拿這個代碼並把它放在顏色位圖的OnTouchListener裏,而不是吸管圖標。

試試這個:

drawView.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      Toast toast = Toast.makeText(getApplicationContext(), colPickMsg, Toast.LENGTH_SHORT); 
      toast.show(); 

      float x = event.getX(); 
      float y = event.getY(); 

      switch (event.getAction()) { 

       case MotionEvent.ACTION_DOWN: 

        p1.x = (int) x; 
        p1.y = (int) y; 

        final int sourceColor = drawView.drawableBitmap.getPixel((int) x, (int) y); 
      } 
     } 
     return true; 
    } 
}); 
+0

這是一個很好的想法。我需要讓它發酵一段時間。 –

+0

也許上面的代碼會適合你,因爲'drawView'似乎是保存位圖的視圖。 – Gi0rgi0s

+0

我越來越近了。我在MainActivity.onClick(視圖視圖){}'代碼' –