该文转自http://blog.csdn.net/xiaoxiaobian3310903/article/details/7760555

使用 Android提供的Path实現图片的截取

重写View的onTouchEvent方法和onDraw方法,onTouchEvent负责实现截取路径的构件,onDraw进行刷新页面,重写View类的代码如下 :

    public class MyView extends View {          private Drawable mDrawable;          private Path mPath;          private float mX = -1;          private float mY = -1;          private float mPastX;          private float mPastY;                    public MyView(Context context) {              super(context);              // TODO Auto-generated constructor stub              mPath = new Path();          }                public void setDrawable(Drawable pDrawable){              mDrawable = pDrawable;          }                @Override          protected void onDraw(Canvas canvas) {              // TODO Auto-generated method stub              super.onDraw(canvas);              Log.i("xiao", "onDraw");              mDrawable.setBounds(0, 0, getWidth(), getHeight());              Rect lRect = mDrawable.getBounds();              Log.i("xiao", "lRect.left =  " + lRect.left + " top = " + lRect.top + " right = " + lRect.right + " bottom = " + lRect.bottom);              if(!mPath.isEmpty()){                  Log.i("xiao", "!mPath.isEmpty()");                  canvas.clipPath(mPath);                  //mDrawable.draw(canvas);              }                            mDrawable.draw(canvas);          }                @Override          public boolean onTouchEvent(MotionEvent event) {              // TODO Auto-generated method stub              Log.i("xiao", "onTouchEvent");              int lAction = event.getAction();              if(mX != -1){                  mPastX = mX;                  mPastY = mY;              }              mX = event.getX();              mY = event.getY();              switch(lAction){              case MotionEvent.ACTION_DOWN:                  mPath.reset();                  mPath.moveTo(mX, mY);                  break;              case MotionEvent.ACTION_MOVE:                  mPath.quadTo(mPastX, mPastY, (mX + mPastX) / 2, (mY + mPastY) / 2);                  break;              case MotionEvent.ACTION_UP:                  mPath.lineTo(mX, mY);                  mX = -1;                  mY = -1;                  invalidate();                  break;              default:                                    break;              }              return true;          }      }  

Activity主要负责获取和设置Drawable和设置布局,代码如下:

    private MyView mView;                     @Override          public void onCreate(Bundle savedInstanceState) {              super.onCreate(savedInstanceState);                            mView = new MyView(this);              mView.setDrawable(this.getResources().getDrawable(R.drawable.test1));              this.setContentView(mView);          }  

未截取时效果:

画一个路径截取效果图:


更多相关文章

  1. Android之back键拦截处理
  2. Android(安卓)Studio 使用NDK编译时常见的问题
  3. android 9.0 在rk3326平台上hidl的使用
  4. Android(安卓)调用系统相机拍照的返回结果
  5. vs xamarin android 监听返回键退出程序
  6. android N 编译环境搭建
  7. Android调用Jni,非常简单的一个Demo
  8. android中获取包名,类名
  9. android View根据自己获取焦点的情况执行语句

随机推荐

  1. 阿里物网LinkDevelop的Android移动DemoAp
  2. android 显示进度的按钮
  3. Android(安卓)Apk 打包
  4. Android中notifyDataSetInvalidated()和n
  5. Android类参考---FragmentManager
  6. cocos2d-x之优化图形性能-IOS/Android
  7. Android零碎知识点-更新中
  8. Android(安卓)Volley 源码解析
  9. android中onMeasure初看,深入理解布局之
  10. 简单的JNI调用