Android 如何创建自定义光标以获取ImageView的颜色
彩色抓取应用程序的图像示例Android 如何创建自定义光标以获取ImageView的颜色,android,imageview,color-picker,Android,Imageview,Color Picker,彩色抓取应用程序的图像示例 您好,我想创建一个Android应用程序来识别图像中的颜色。我想使用自定义光标或视觉触摸来让用户知道上次触摸的区域,或者只是让用户在触摸图像时知道拾取的颜色。换句话说,我想为图像创建一个类似放大镜的光标。我想不出一个合适的名字,所以为了让我的解释清楚,请检查所附的图片:。谢谢看看这个类,这是一个自定义的ImageView。在onTouch()中获取坐标,并从该坐标中获取像素颜色。请根据您的使用情况自由修改 <com.xbadal.views.MyIma
您好,我想创建一个Android应用程序来识别图像中的颜色。我想使用自定义光标或视觉触摸来让用户知道上次触摸的区域,或者只是让用户在触摸图像时知道拾取的颜色。换句话说,我想为图像创建一个类似放大镜的光标。我想不出一个合适的名字,所以为了让我的解释清楚,请检查所附的图片:。谢谢看看这个类,这是一个自定义的ImageView。在onTouch()中获取坐标,并从该坐标中获取像素颜色。请根据您的使用情况自由修改
<com.xbadal.views.MyImageView
android:id="@+id/signature_canvas"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:visibility="gone"
tools:visibility="visible" />
public class MyImageView extends android.support.v7.widget.AppCompatImageView {
private final String TAG = getClass().getName();
private final float TOLERANCE = 20;
private final int defaultWidth = 30;
private Bitmap mBitmap;
private Canvas mCanvas;
private Context context;
private Paint paint;
private Point point;
private float mLastTouchX;
private float mLastTouchY;
private int imageX;
private int imageY;
//Parameter Constructor
public MyImageView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
// override onSizeChanged
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
Log.d(TAG, "onSizeChanged: " + h + "-" + w);
mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
}
//Overriding onTouch
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
//Invert Matrix to get proper coordinate
float[] eventXY = new float[]{x, y};
Matrix invertMatrix = new Matrix();
getImageMatrix().invert(invertMatrix);
invertMatrix.mapPoints(eventXY);
imageX = (int) eventXY[0];
imageY = (int) eventXY[1];
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
mLastTouchX = x;
mLastTouchY = y;
invalidate();
break;
case MotionEvent.ACTION_MOVE:
final float dx = x - mLastTouchX;
final float dy = y - mLastTouchY;
if (Math.abs(dx) >= TOLERANCE || Math.abs(dy) >= TOLERANCE) {
mLastTouchX = x;
mLastTouchY = y;
invalidate();
}
break;
case MotionEvent.ACTION_UP:
mLastTouchX = x;
mLastTouchY = y;
invalidate();
break;
}
return true;
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawShape(canvas, mLastTouchX, mLastTouchY, defaultWidth);
}
//this method will detemine which shape to be drawn on the basis of ShapeId
public void drawShape(Canvas canvas, float x, float y, int width) {
paint = new Paint();
point = new Point();
point.set((int) x, (int) y);
Bitmap bitmap = ((BitmapDrawable) this.getDrawable()).getBitmap();
if (x >= 0 && x < bitmap.getWidth() && y >= 0 && y < bitmap.getHeight()) {
if (imageX >= 0 && imageX < bitmap.getWidth() && imageY >= 0 && imageY < bitmap.getHeight()) {
int pixel = (bitmap.getPixel(imageX, imageY));
int redValue = Color.red(pixel);
int blueValue = Color.blue(pixel);
int greenValue = Color.green(pixel);
int alpha = Color.alpha(pixel);
}
}
}
公共类MyImageView扩展了android.support.v7.widget.AppImageView{
私有最终字符串标记=getClass().getName();
专用最终浮动公差=20;
私有最终int defaultWidth=30;
私有位图mBitmap;
私人帆布mCanvas;
私人语境;
私人油漆;
专用点;
私有浮动mLastTouchX;
私密的浮躁和敏感;
私人int imageX;
私人图像;
//参数构造函数
公共MyImageView(上下文、属性集属性){
超级(上下文,attrs);
this.context=上下文;
}
//覆盖范围已更改
@凌驾
已更改尺寸的受保护空心(整数w、整数h、整数oldw、整数oldh){
super.onSizeChanged(w,h,oldw,oldh);
Log.d(标签“onSizeChanged:”+h+“-”+w);
mBitmap=Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);
mCanvas=新画布(mBitmap);
}
//覆盖onTouch
@凌驾
公共布尔onTouchEvent(运动事件){
float x=event.getX();
float y=event.getY();
//将矩阵求逆以获得适当的坐标
float[]eventXY=新的float[]{x,y};
矩阵逆矩阵=新矩阵();
getImageMatrix().invert(invertMatrix);
逆矩阵映射点(eventXY);
imageX=(int)eventXY[0];
imageY=(int)eventXY[1];
开关(event.getAction()&MotionEvent.ACTION\u掩码){
case MotionEvent.ACTION\u DOWN:
mLastTouchX=x;
mLastTouchY=y;
使无效();
打破
case MotionEvent.ACTION\u移动:
最终浮点数dx=x-mLastTouchX;
最终浮子dy=y—最大浮子厚度;
如果(数学abs(dx)>=公差| |数学abs(dy)>=公差){
mLastTouchX=x;
mLastTouchY=y;
使无效();
}
打破
case MotionEvent.ACTION\u UP:
mLastTouchX=x;
mLastTouchY=y;
使无效();
打破
}
返回true;
}
@凌驾
公共空白onDraw(画布){
super.onDraw(帆布);
drawShape(画布、mLastTouchX、mLastTouchY、默认宽度);
}
//此方法将根据ShapeId确定要绘制的形状
公共虚空drawShape(画布、浮点数x、浮点数y、整数宽度){
油漆=新油漆();
点=新点();
点集((int)x,(int)y);
位图位图=((BitmapDrawable)this.getDrawable()).getBitmap();
如果(x>=0&&x=0&&y=0&&imageX=0&&imageY
}谢谢您的回答,但是如果我想在文本视图上显示颜色值,是否可能?文本视图位于不同的活动中。。