android实现使用绘图作出一种裁剪任意多边形快速算法

在一个重写的View,主要绘制在View的OnDraw()方法中,

首先:先绘制出几个点,当然是任意多

最后一个点和第一个点闭合在一起之后,画点结束

然后可以随意拖动达到裁减的效果

当然裁剪的功能没有实现


代码如下


View--------:
--**************************************************************
public class MyView extends View{


public int doWhat = 0;
ArrayList<HashMap<String,Float>> list = new ArrayList<HashMap<String,Float>>();

public MyView(Context context) {
super(context);
setBackgroundResource(R.drawable.youxibiajii);
}

protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setColor(Color.GREEN);

for (int i = 0; i < list.size(); i++) {
canvas.drawCircle(list.get(i).get("x"), list.get(i).get("y")
, 10, paint);
if(i>0){
canvas.drawLine(list.get(i-1).get("x"), list.get(i-1).get("y"),
list.get(i).get("x"), list.get(i).get("y"), paint);
}
}

}
*******************************************************************************************
Activity-------******************************************************************
public class MainActivity extends Activity {
public static float  ScreenW,ScreenH;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DisplayMetrics dis = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dis);
ScreenW = dis.widthPixels;
ScreenH = dis.heightPixels;
final MyView view = new MyView(this);
setContentView(view);
view.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View arg0, MotionEvent event) {
float startX = event.getRawX();
float startY = event.getRawY();
if(view.doWhat == 0){//画点
switch(event.getAction()){
case KeyEvent.ACTION_DOWN:
HashMap<String,Float> map = new HashMap<String, Float>();


if(view.list.size()>2&&
(startX>view.list.get(0).get("x")-20&&startY>view.list.get(0).get("y")-20)
&&(startX<view.list.get(0).get("x")+20&&startY<view.list.get(0).get("y")+20)){
map.put("x", view.list.get(0).get("x"));
map.put("y", view.list.get(0).get("y"));
view.list.add(map);
view.doWhat = 1;
break;
}
map.put("x", startX);
map.put("y", startY);
view.list.add(map);
break;
}
}
else{//拖动
for (int i = 0; i < view.list.size(); i++) {
if((startX>view.list.get(i).get("x")-15&&startY>view.list.get(i).get("y")-15)
&&(startX<view.list.get(i).get("x")+15&&startY<view.list.get(i).get("y")+15)){
if(i==0){
view.list.get(i).put("x", startX);
view.list.get(i).put("y", startY);
view.list.get(view.list.size()-1).put("x", startX);
view.list.get(view.list.size()-1).put("y", startY);
}
else{
view.list.get(i).put("x", startX);
view.list.get(i).put("y", startY);
}
break;
}
}
}
view.invalidate();
return true;
}
});
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值