我正在研究应用程序的一项功能,该功能允许用户在图像上拖动颜色选择器,然后替换相应设计中的像素。我有它在Android模拟器上工作,但在实际设备上很慢。拖动选择器时,颜色更新需要很长时间,这会使选择器在屏幕上跳跃而不是平滑拖动,颜色会逐渐变化。
balls.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(balls.getLayoutParams());
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
numtimes=numtimes+1;
int x_cord = (int)event.getRawX();
int y_cord = (int)event.getRawY();
ImageView ColorImage = (ImageView) findViewById(300);
Bitmap bitmap = ((BitmapDrawable)ColorImage.getDrawable()).getBitmap();
int pixel = bitmap.getPixel(XIT,YIT);
UpdateColor(pixel);
break;
default:
break;
}
return true;
}
});
protected void UpdateColorOne(int pixel) {
// Update Custom Ball
ImageView balls = (ImageView) findViewById(27);
GradientDrawable shapeNX = new GradientDrawable();
shapeNX.setColor(pixel);
balls.setBackground(shapeNX);
//Update Image
BitmapFactory.Options options = new BitmapFactory.Options();
options.inMutable = true;
Bitmap myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pimage, options);
int[] pixels = new int[myBitmap.getHeight() * myBitmap.getWidth()];
myBitmap.getPixels(pixels, 0, myBitmap.getWidth(), 0, 0, myBitmap.getWidth(), myBitmap.getHeight());
/BeginEdit
for (int i = 0; i < myBitmap.getWidth() * myBitmap.getHeight(); i++) {
int p = pixels[i];
int R = (p >> 16) & 0xff;
int G = (p >> 8) & 0xff;
int B = p & 0xff;
if (R > 200 && G < 200) {
pixels[i] = pixel;
}
}
myBitmap.setPixels(pixels, 0, myBitmap.getWidth(), 0, 0, myBitmap.getWidth(), myBitmap.getHeight());
Drawable DD = new BitmapDrawable(getResources(), myBitmap);
ImageView imgArrow = (ImageView) findViewById(1000);
imgArrow.setImageDrawable(DD);
}
几点说明: - 只更新自定义球/选择器时速度很好。 - 我不认为预设图像的大小是一个主要因素。我已经尝试评论for循环(下面标记为&#34; Begin Edit&#34;)并且它仍然很慢。 getPixels / setPixels和其他位图的东西似乎是慢点。
我还没有找到另一种方法来达到这个效果!需要使用像素数据来完成,因为更改很复杂。我在iPhone上工作正常 - 当然必须有一种方法可以在Android上有效地进行操作吗?