自定义View(擦除蒙版得到背景,存储图片,更换背景)
2015-09-18 20:20
363 查看
效果图:
代码
MyBitmapTwo[code]package com.example.administrator.mywidgetmode.Bitmapview; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ComposePathEffect; import android.graphics.CornerPathEffect; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.Window; import com.example.administrator.mywidgetmode.R; /** * Created by Administrator on 2015/9/17. */ public class MyBitmapTwo extends View{ private int width; private int height; private Bitmap mBitmap; private Paint mPaintCircel; private Paint mPaintRect; private Canvas canvasBit; private Bitmap mBitmapBackground; private Matrix matrix; public MyBitmapTwo(Context context) { super(context); } public MyBitmapTwo(Context context, AttributeSet attrs) { super(context, attrs); path=new Path(); mBitmapBackground=BitmapFactory.decodeResource(getResources(),R.mipmap.d); matrix=new Matrix(); //***画笔 mPaintCircel=new Paint(); mPaintCircel.setColor(Color.YELLOW); //绿色画笔 mPaintRect=new Paint(); mPaintRect.setColor(Color.GREEN); //图形交叉 PorterDuffXfermode mode=new PorterDuffXfermode(PorterDuff.Mode.XOR);//交叉的部分显示背景 mPaintCircel.setXfermode(mode); //移动时用线 mPaintCircel.setStrokeJoin(Paint.Join.ROUND);//设置线段中间用圆形填充 mPaintCircel.setStrokeCap(Paint.Cap.ROUND);//设置线段开头是圆形 mPaintCircel.setStrokeWidth(50); mPaintCircel.setStyle(Paint.Style.FILL_AND_STROKE);//非空心 mPaintCircel.setPathEffect(new CornerPathEffect(360)); mPaintCircel.setAntiAlias(true);//消锯齿 } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec); height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec); setMeasuredDimension(width, height);//设置画布的大小,长和宽 mBitmap = Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888); canvasBit=new Canvas(mBitmap); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(mBitmapBackground,new Rect(0,0,mBitmapBackground.getWidth(),mBitmapBackground.getHeight()),new Rect(0,0,width,height),null);//用图片做背景 //canvas.drawColor(Color.RED);//设置背景色 canvasBit.drawRect(0,0,width,height,mPaintRect);//跟view大小一样的绿色矩形 canvasBit.drawPath(path,mPaintCircel);//按路径画图形, // 这里要注意,画笔必须得是得到图形交叉模式的画笔 PorterDuffXfermode mode=new PorterDuffXfermode(PorterDuff.Mode.XOR);mPaintCircel.setXfermode(mode); canvas.drawBitmap(mBitmap, 0, 0, null); } float x; float y; float old_x; float old_y; private Path path; @Override//点击事件 public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: x=event.getX(); y=event.getY(); path.moveTo(x,y); invalidate(); old_x=x; old_y=y; return true; case MotionEvent.ACTION_MOVE: x=event.getX(); y=event.getY(); path.moveTo(old_x,old_y); path.lineTo(x,y); // path.quadTo((x+old_x)/2,(y+old_y)/2,x,y);//跟上面的lineTo效果一样 invalidate(); old_x=x; old_y=y; return true; } return super.onTouchEvent(event); } }
MyBitmapTwoActivity
[code]package com.example.administrator.mywidgetmode.Bitmapview; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import com.example.administrator.mywidgetmode.R; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /** * Created by Administrator on 2015/9/17. */ public class MyBitmapTwoActivity extends AppCompatActivity { private Button mBt; private MyBitmapTwo myBitmapTwo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bitmap_two); myBitmapTwo= (MyBitmapTwo) findViewById(R.id.myBitmapTwo); mBt= (Button) findViewById(R.id.button_jpg); mBt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { myBitmapTwo.setDrawingCacheEnabled(true); Bitmap bitmap=myBitmapTwo.getDrawingCache(true); File file=new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg"); if(!file.exists()){ try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } try { bitmap.compress(Bitmap.CompressFormat.JPEG,100,new FileOutputStream(file)); } catch (FileNotFoundException e) { e.printStackTrace(); } } } }); } }
layout
[code]<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/button_jpg" android:text="保存图片" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <com.example.administrator.mywidgetmode.Bitmapview.MyBitmapTwo android:id="@+id/myBitmapTwo" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
更换背景
自己写一个valuesmyview_attr
[code]<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="myview"> <attr name="myview_backgroud" format="reference"></attr> <attr name="myview_paintwidth" format="dimension|reference"></attr> </declare-styleable> </resources>
layout
[code]<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:myview="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/button_jpg" android:text="保存图片" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <com.example.administrator.mywidgetmode.Bitmapview.MyBitmapTwo android:id="@+id/myBitmapTwo" android:layout_width="match_parent" android:layout_height="match_parent" myview:myview_backgroud="@mipmap/b" myview:myview_paintwidth="30dp"/> </LinearLayout>
MyBitmapTwo
在重写MyBitmapTwo方法里加入下面的代码,更换背景,和自定义画笔的大小
[code] final TypedArray typedArray=context.obtainStyledAttributes(attrs,R.styleable.myview); BitmapDrawable dra = (BitmapDrawable) typedArray.getDrawable(R.styleable.myview_myview_backgroud); if (dra!=null){ Log.d("drawable",""+dra.getIntrinsicWidth()); mBitmapBackground=dra.getBitmap(); }else { mBitmapBackground=BitmapFactory.decodeResource(getResources(),R.mipmap.d); } int paintWidth=typedArray.getDimensionPixelOffset(R.styleable.myview_myview_paintwidth,30);
相关文章推荐
- 中文编码过滤器: 界面输出中文及中文请求参数(post方式有效)编码过滤器
- 苹果app上线流程
- 利用ViewPager实现左右滑屏
- 标题hehehe
- Jump Game II
- 长春网络赛 1108
- CentOS7安装phpMyAdmin
- 长春网络赛 1102
- 前端性能优化(十七)
- ios-新浪微博开发-15(新特性3)
- hdu3555(数位dp)
- Android——Hander和AsyncTask的使用
- QT调用VC dll方法
- Regional Changchun Online--Travel(Kruskal && 并查集)
- 杭电acm--2043
- 长春网络赛 1101
- HDU5432-Pyramid Split
- BaseMode 数据的封装成对象
- CUnit使用入门-精简的C语言单元测试工具
- 做事的真正态度