一种在一张图片上涂改的效果
来源:互联网 发布:深圳软件开发定制 编辑:程序博客网 时间:2024/06/11 17:14
想在一张图片上进行图画操作我想应该需要一个自定义view来实现这个画图的操作
public class PaintView extends View{Paint paint;float mX,mY;Path path;private static final float TOUCH_TOLERANCE=4;Bitmap bitmap;Canvas mcanvas;Paint bitmapPaint;List<Drawpath> savepathlist;//用来保存路径Drawpath dp;int bitmapwidth;int bitmaphight;public PaintView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public PaintView(Context context, AttributeSet attrs) {super(context, attrs);DisplayMetrics dm=new DisplayMetrics();//获得((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(dm);bitmapwidth= dm.widthPixels;bitmaphight=dm.heightPixels-2*45;savepathlist=new ArrayList<Drawpath>();initCanvas();}private void initCanvas() {paint =new Paint(Paint.ANTI_ALIAS_FLAG);//设置画笔抗锯齿paint.setDither(true);paint.setColor(Color.RED);//设置画笔颜色paint.setStyle(Paint.Style.STROKE);paint.setStrokeJoin(Paint.Join.ROUND);//?paint.setStrokeCap(Paint.Cap.ROUND);//?paint.setStrokeWidth(5);//设置描边宽度bitmap=Bitmap.createBitmap(bitmapwidth,bitmaphight, Config.ARGB_8888);//先给Bitmap一个默认值1,方便以下变量初始化mcanvas=new Canvas(bitmap);mcanvas.drawColor(0x00FFFFFF);path=new Path();//创建画笔路径?bitmapPaint=new Paint(Paint.DITHER_FLAG);//?}public PaintView(Context context) {super(context);}@Overrideprotected void onDraw(Canvas canvas ) {super.onDraw(canvas);canvas.drawColor(0x00FFFFFF);canvas.drawBitmap(bitmap, 0, 0, bitmapPaint); //显示旧的画布 if (path != null) {// 实时的显示canvas.drawPath(path, paint);}}class Drawpath{Paint dpaint;Path dpath;}public void doback(){if(savepathlist != null && savepathlist.size() > 0){//调用初始化画布函数以清空画布initCanvas();//将路径保存列表中的最后一个元素删除 ,并将其保存在路径删除列表中Drawpath drawPath = savepathlist.get(savepathlist.size() - 1);savepathlist.remove(savepathlist.size() - 1);//将路径保存列表中的路径重绘在画布上Iterator<Drawpath> iter = savepathlist.iterator(); //重复保存while (iter.hasNext()) {Drawpath dp = iter.next();mcanvas.drawPath(dp.dpath, dp.dpaint);}invalidate();// 刷新}}public void clearbitmap(){//调用初始化画布函数以清空画布initCanvas();invalidate();//刷新savepathlist.clear();}private void onTouchDown(float x,float y){path.reset();//重新设置路径path.moveTo(x, y);mX=x;mY=y;}private void onTouchMove(float x,float y){float dx=Math.abs(x-mX);float dy=Math.abs(y-mY);if(dx>=TOUCH_TOLERANCE||dy>=TOUCH_TOLERANCE){path.quadTo(mX, mY, (x+mX)/2, (y+mY)/2);mX=x;mY=y;}}private void onTouchUp(){path.lineTo(mX, mY);//从最后一个指定的xy点绘制一条线,如果没有用moveTo方法,那么起始点0,0点mcanvas.drawPath(path, paint);//设置手指离开时的路径savepathlist.add(dp);Log.i("TAG","-----------size:--------"+savepathlist.size());path=null;} @Overridepublic boolean onTouchEvent(MotionEvent event) {float x=event.getX();float y=event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:path=new Path();dp=new Drawpath();dp.dpaint=paint;dp.dpath=path;onTouchDown(x, y);invalidate();//刷新画布,重新运行ondraw;break;case MotionEvent.ACTION_MOVE:onTouchMove(x, y);invalidate();break;case MotionEvent.ACTION_UP:onTouchUp();invalidate();break;default:break;}return true;}}接下来我的思路就是将这个自定义view和图片在一个FrameLayout里,就是将这个自定义view蒙在一张图片上.
<FrameLayout android:id="@+id/fralyt_pictureActivity" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" > <ImageView android:id="@+id/iv_pictureActivity" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="fitXY" android:src="@drawable/pic_default" /> <cn.com.PaintView android:id="@+id/paintview_pictureActivity" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>接下来就可以才画啦。。。画的时候调用自定view的ondrow方法就可以啦····
然后想保存这张图画后的图片我的方法是吧这个framelayout保存成一个图片然后放在sdcard里。显得好笨····
framelayout.setDrawingCacheEnabled(true);framelayout.layout (0, 0, framelayout.getWidth(), framelayout.getHeight()); final Bitmap bp = framelayout.getDrawingCache();//获得可视组件的截图final String path = Constants.ROOT_PATH+Constants.EditPictureDir;/*//转换成2进制流ByteArrayOutputStream baos=new ByteArrayOutputStream(); bp.compress(Bitmap.CompressFormat.PNG, 100, baos); byte [] bitmapByte =baos.toByteArray(); *//** * 起线程写入文件 */myDialog= ProgressDialog.show(PictureEditActivity.this, "正在保存..", "请稍后..", true, true);new Thread(){public void run() {try {//Bitmap bitmap=ImageUtil.comp(bp);File dir = new File(path);if (!dir.exists()) {dir.mkdirs();}File file = new File(dir, "raw_"+new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+".png");FileOutputStream out = new FileOutputStream(file);bp.compress(CompressFormat.PNG,100, out);out.flush();out.close();String filepath=file.getAbsolutePath();Message.obtain(handler, 105, filepath).sendToTarget();}catch (Exception e) {e.printStackTrace();}};}.start();}
0 0
- 一种在一张图片上涂改的效果
- 进度度是在一张背影图片上绘制的,效果是让图片逐渐变色
- Relative布局,一张图片在另一张上面的效果
- 单击图片实现“原图比例展示、上一张、下一张”类似相册的效果
- 14.9.29关于在图片下面做上一张与下一张按钮的android程序
- 如何在对话框上显示一张图片
- 在一张图片上实现截图功能
- 在SurfaceView上拖动一张小图片
- 用QImage创建合成的图片(一张图片堆叠在另一张图片上)
- 点击图片变暗效果 省去一张点击效果的图片
- 如何在PPT中实现多张图片叠加在一起,点击消失一张出来下一张的效果
- 获取网络上的一张图片并显示在界面上
- 怎样在一张图片上叠加另一张图片
- css设置:在一张图片上加载另一张图片
- 获取网络上的一张图片.
- 读取手机上的一张图片
- IOS根据一张图片获取它的模糊效果图片
- 如何在一张图片上添加多个不同的链接-热点篇
- Linux 安装phpredis扩展
- HDU 3666 (差分约束)
- Android view 滑动事件冲突解决方法(理论篇)
- cisco路由器上做IPSec-VPN
- centOS7 无法ping
- 一种在一张图片上涂改的效果
- Memcached初步认识
- c#网络共享上传文件
- 物质之学 —— 等离子(物质的第四态)
- 五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法
- docker.dmg放在360云盘了,官网的太慢了
- C++ 多态
- jquery easyui使用心得
- JAVA责任链模式-过滤器原理