我正在使用最新的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中的偵聽器。
不dropButton保持與色彩的形象呢? – Gi0rgi0s
不是。圖像處於單獨視圖中。如果你能解釋你的意思,我可以改變它。 –
請發佈單獨視圖的代碼 – Gi0rgi0s