我正在尝试创建一个矩形,但是当我从起始坐标移动到结束坐标时会发生这种情况
,实际上我想显示当用户从一个点移动到另一个点时的进度。这就是我想要的。
代码: -
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
downx = event.getX();
downy = event.getY();
//v.invalidate();
break;
case MotionEvent.ACTION_MOVE:
upx = event.getX();
upy = event.getY();
canvas.drawRect(downx, downy, upx, upy, paint);
}
choosenImageView.invalidate();
break;
case MotionEvent.ACTION_UP:
upx = event.getX();
upy = event.getY();
canvas.drawRect(downx, downy, upx, upy, paint);
}
}
// v.invalidate();
break;
}
return true;
}
编辑我想要做的是显示进度,即当用户移动手指时,应绘制形状。
建议/样品/链接任何事情都将不胜感激。
答案 0 :(得分:9)
您正在直接更新onTouch()
事件中的画布而不先清除它。这不是在视图中绘制内容的假设方式(假设这是你想要的)。
相反,您应该存储矩形的开始和当前坐标,并在onDraw()
事件中使用它们来绘制实际矩形(在Adnroid为您清除Canvas的无效部分之后)。如果需要重绘画布,Android将发出此事件,因此您需要使用onTouch()
方法告知invalidate()
事件中这是必需的:
class myView extends View { // or some other View-based class
boolean drawRectangle = false;
PointF beginCoordinate;
PointF endCoordinate;
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
drawRectangle = true; // Start drawing the rectangle
beginCoordinate.x = event.getX();
beginCoordinate.y = event.getY();
endCoordinate.x = event.getX();
endCoordinate.y = event.getY();
invalidate(); // Tell View that the canvas needs to be redrawn
break;
case MotionEvent.ACTION_MOVE:
endCoordinate.x = event.getX();
endCoordinate.y = event.getY();
invalidate(); // Tell View that the canvas needs to be redrawn
break;
case MotionEvent.ACTION_UP:
// Do something with the beginCoordinate and endCoordinate, like creating the 'final' object
drawRectangle = false; // Stop drawing the rectangle
invalidate(); // Tell View that the canvas needs to be redrawn
break;
}
return true;
}
protected void onDraw(Canvas canvas) {
if(drawRectangle) {
// Note: I assume you have the paint object defined in your class
canvas.drawRect(beginCoordinate.x, beginCoordinate.y, endCoordinate.x, endCoordinate.y, paint);
}
}
}
答案 1 :(得分:6)
你在两个矩形之间清理画布吗? 添加如下函数:
void clearCanvas()
{
canvas.drawRect(0,0, width, height, paint);
}
答案 2 :(得分:3)
抱歉,亲爱的,我给你使用的全部活动,并在画布上绘制rect。
public class CanvasExample extends Activity
{
/** Called when the activity is first created. */
RelativeLayout relMainOperationLayout;
RelativeLayout relTabHeader;
//RelativeLayout relMidalLayout;
RelativeLayout relBelowLayout;
Context myContext;
DrawCanvas drawCanvas;
static boolean loadFlage=true;
BibleHelper bibleHelper;
Bitmap mainBitmap;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
myContext=CanvasExample.this;
bibleHelper=new BibleHelper(CanvasExample.this,myContext);
bibleHelper.setFullScreen();
LayoutInflater layoutInflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
int layoutId = myContext.getResources().getIdentifier("main","layout",getPackageName());
relMainOperationLayout = (RelativeLayout) layoutInflater.inflate(layoutId,null);
relTabHeader=(RelativeLayout) relMainOperationLayout.findViewById(R.id.relHeadLayout);
//relMidalLayout=(RelativeLayout) relMainOperationLayout.findViewById(R.id.relmidalLayout);
relBelowLayout=(RelativeLayout) relMainOperationLayout.findViewById(R.id.relBelowLayout);
mainBitmap=getIconDrawable(R.drawable.splash);
drawCanvas=new DrawCanvas(CanvasExample.this,myContext);
//drawCanvas.setBackgroundColor(Color.YELLOW);
//drawCanvas.setBackgroundDrawable(CanvasExample.this.getResources().getDrawable(R.drawable.splash));
drawCanvas.setBackgroundDrawable(new BitmapDrawable(mainBitmap));
RelativeLayout.LayoutParams drawParams=new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
drawParams.addRule(RelativeLayout.BELOW, relTabHeader.getId());
//relMidalLayout.addView(drawCanvas,drawParams);
relMainOperationLayout.addView(drawCanvas,drawParams);
// mainImageView=new ImageView(CanvasExample.this);
//
// RelativeLayout.LayoutParams mainParams=new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,200);
// relMainOperationLayout.addView(mainImageView,mainParams);
// mainImageView.setBackgroundDrawable(CanvasExample.this.getResources().getDrawable(R.drawable.ic_launcher));
setContentView(relMainOperationLayout);
}
class DrawCanvas extends View
{
Context drawContext;
Activity drawActivity;
ImageView image;
Paint mPaint;
int left=0,right=0,top=0,bottom=0;
Canvas passCanvas;
//Bitmap bitmapOrg;
// bitmapOrg;
public DrawCanvas(Activity activity,Context context)
{
super(activity);
this.drawActivity=activity;
this.drawContext=context;
//bitmapOrg = BitmapFactory.decodeResource(getResources(),R.drawable.splash);
mPaint = new Paint();
mPaint.setDither(true);
mPaint.setColor(Color.RED);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(3);
mPaint.setFilterBitmap(true);
this.setOnTouchListener(new View.OnTouchListener() {
//@Override
public boolean onTouch(View v, MotionEvent event)
{
switch (event.getActionMasked())
{
case MotionEvent.ACTION_DOWN:
invalidate();
left=(int) event.getX();
right=left+1;
top=(int) event.getY();
bottom=top+1;
mPaint.setColor(Color.BLACK);
onDraw(passCanvas=new Canvas());
break;
case MotionEvent.ACTION_MOVE:
invalidate();
int tempX=(int) event.getX();
//System.err.println("Get X->"+event.getX());
if(tempX>right)
{
right=right+1;
}
else
{
right=right-1;
}
//System.err.println("Get Y->"+event.getY());
int tempY=(int) event.getY();
if(tempY>bottom)
{
bottom=bottom+1;
}else
{
bottom=bottom-1;
}
mPaint.setColor(Color.GREEN);
onDraw(passCanvas=new Canvas());
break;
case MotionEvent.ACTION_UP:
invalidate();
mPaint.setColor(Color.RED);
onDraw(passCanvas=new Canvas());
System.err.println("After Touch Up");
CanvasExample.loadFlage=false;
onDraw(passCanvas=new Canvas());
/*
bibleHelper.showErrorLog("Start X -->"+left);
bibleHelper.showErrorLog("Real X -->"+event.getX());
bibleHelper.showErrorLog("End X-->"+right);
bibleHelper.showErrorLog("Start Y-->"+top);
bibleHelper.showErrorLog("Real Y-->"+top);
bibleHelper.showErrorLog("End Y-->"+bottom);
*/
Bitmap croppedBmp = Bitmap.createBitmap(mainBitmap,left,top,right,bottom);
final Dialog dialog = new Dialog(CanvasExample.this);
dialog.setContentView(R.layout.custom_dialog);
dialog.setTitle("Title...");
dialog.setCancelable(true);
ImageView image = (ImageView) dialog.findViewById(R.id.main);
image.setImageBitmap(croppedBmp);
Button btnClose=(Button) dialog.findViewById(R.id.btnClose);
btnClose.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
dialog.dismiss();
}
});
dialog.show();
break;
default:
break;
}
return true;
}
});
}
@Override
protected void onDraw(Canvas canvas)
{
canvas.drawRect(left, top, right, bottom, mPaint);
}
}
private Bitmap getIconDrawable(int imageId)
{
//Drawable rtnDrawable = null;
Bitmap imageBitmap=null;
try
{
int getImageWH[];
imageBitmap = BitmapFactory.decodeResource(getResources(),imageId);
int IW = imageBitmap.getWidth();
int IH = imageBitmap.getHeight();
bibleHelper.showErrorLog("Icon Width->" + IW);
bibleHelper.showErrorLog("Icon Height->" + IH);
WindowManager winManager = (WindowManager) CanvasExample.this.getSystemService(Context.WINDOW_SERVICE);
int screenwidth = winManager.getDefaultDisplay().getWidth();
int screenheight = winManager.getDefaultDisplay().getHeight();
getImageWH = bibleHelper.getObjectWidthHeight(screenwidth,screenheight, IW, IH);
bibleHelper.showErrorLog("Get Icon Width->" + getImageWH[0]);
bibleHelper.showErrorLog("Get Icon Height->" + getImageWH[1]);
imageBitmap = Bitmap.createScaledBitmap(imageBitmap, getImageWH[0],getImageWH[1], false);
bibleHelper.showErrorLog("New Width-->"+imageBitmap.getWidth());
bibleHelper.showErrorLog("New Height-->"+imageBitmap.getHeight());
//rtnDrawable = (Drawable) new BitmapDrawable(imageBitmap);
} catch (Exception ex) {
bibleHelper.showErrorLog("Convert Icon Exception-->"+ ex.toString());
}
//return rtnDrawable;
return imageBitmap;
}
}
在这本BibleHelper中,Helper类女巫用来显示一些信息和日志。
答案 3 :(得分:2)
case MotionEvent.ACTION_MOVE:
upx = event.getX();
upy = event.getY();
canvas.drawRect(downx, downy, upx, upy, paint);
}
choosenImageView.invalidate();
break;
此代码导致它。因为你在这里创建了许多矩形。相反,在onDraw(Canvas canvas)
中有drawRect方法并对所有事件使用invalidate。希望这会有所帮助。
答案 4 :(得分:2)
如果我理解你是正确的,你希望用户在屏幕上绘制矩形,然后你就可以在显示器上绘制它。
我认为你可以画一个用户按下的点,只是为了给用户一个反馈,当他完成绘图时你用矩形代替
或者绘制矩形的线条,这样用户就可以开始绘图,并且从开始到手指有一条线,当用户改变方向时,你会从用户改变方向和手指开始一条新线,然后当用户返回开始你有一个矩形绘制为4行