android实现图片按任意路径截取
16lz
2022-06-01
该文转自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); }
未截取时效果:
画一个路径截取效果图:
更多相关文章
- Android之back键拦截处理
- Android(安卓)Studio 使用NDK编译时常见的问题
- android 9.0 在rk3326平台上hidl的使用
- Android(安卓)调用系统相机拍照的返回结果
- vs xamarin android 监听返回键退出程序
- android N 编译环境搭建
- Android调用Jni,非常简单的一个Demo
- android中获取包名,类名
- android View根据自己获取焦点的情况执行语句