Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android java从ImageView拾取颜色_Java_Android - Fatal编程技术网

android java从ImageView拾取颜色

android java从ImageView拾取颜色,java,android,Java,Android,我正在使用最新的Android IDE。我的UI中有一个滴管图标,用户可以从应用程序弹出的位图中选择颜色。我在图标上设置了一个监听器,但我找不到方法让它等待下一次触摸,从中可以计算出像素颜色。到目前为止,代码很简单: //Open the eyedropper dropBtn = (ImageButton) findViewById(R.id.drop_btn); dropBtn.setOnTouchListener( new View.OnTouchListener() {

我正在使用最新的Android IDE。我的UI中有一个滴管图标,用户可以从应用程序弹出的位图中选择颜色。我在图标上设置了一个监听器,但我找不到方法让它等待下一次触摸,从中可以计算出像素颜色。到目前为止,代码很简单:

//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的更改也可以很好地工作。不起作用的是,我被困在这个监听器中——我想回到的原始OntouchVentListener。我还没有找到一种方法来阻止安卓系统中的监听器。

我想你的方法是反向的。问题是,
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;
    }
});

我想你把它倒过来了。问题是,
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;
    }
});


dropButton是否保留带有颜色的图像?否。图像位于单独的视图中。如果你能解释你的意思,我可以更改。请发布单独视图的代码。我将工程视图作为编辑添加到原始帖子中。dropButton是否保留带有颜色的图像?否。图像位于单独视图中。如果你能解释你的意思,我可以改变。请发布单独视图的代码。我将工程视图作为编辑添加到原始帖子中。这是一个好主意。我需要让它发酵一会儿。也许上面的代码对你有用,因为
drawView
似乎是保存位图的视图。我越来越近了。我已经在MainActivity.onClick(View-View){}
code
中实现了这样的onTouch列表器,我已经将我最新的代码尝试作为对原始帖子的编辑。我还没有找到一种将代码放入注释的方法。我离得更近了,但还是不工作。我想我误解了你所说的“将其放入颜色位图的OnTouchListener”的意思,那么现在发生了什么?怎么会这样?这是个好主意。我需要让它发酵一会儿。也许上面的代码对你有用,因为
drawView
似乎是保存位图的视图。我越来越近了。我已经在MainActivity.onClick(View-View){}
code
中实现了这样的onTouch列表器,我已经将我最新的代码尝试作为对原始帖子的编辑。我还没有找到一种将代码放入注释的方法。我离得更近了,但还是不工作。我想我误解了你所说的“将其放入颜色位图的OnTouchListener”的意思,那么现在发生了什么?这是怎么一回事?