OnTouchEvent、 自定义属性
来源:互联网 发布:房子装修软件app 编辑:程序博客网 时间:2024/06/06 17:54
OnTouchEvent
书接昨天,onTouchEvent是自定义view中的一个方法,今天给一个抹掉图层的小游戏,用到的是onTouchEvent和Xfermode。
抹掉图层,并且保存图片
package com.example.administrator.myviewdemo;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;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.drawable.BitmapDrawable;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;/** * Created by Administrator on 2015/9/17. */public class MyBitmapView2 extends View { private int width; private int height; private Bitmap mBitmap; private Paint mPaintCricle; private Paint mPaintRect; private Bitmap mBitmapBackGround; private Matrix matrix; private Path path; public MyBitmapView2(Context context) { super(context); } public MyBitmapView2(Context context, AttributeSet attrs) { super(context, attrs); mPaintCricle = new Paint(); mPaintCricle.setStrokeWidth(30); mPaintRect = new Paint(); path = new Path(); mPaintRect.setColor(Color.YELLOW); mPaintCricle.setColor(Color.BLUE); mPaintCricle.setStrokeJoin(Paint.Join.ROUND); mPaintCricle.setStrokeCap(Paint.Cap.ROUND); mPaintCricle.setStyle(Paint.Style.FILL_AND_STROKE); mPaintCricle.setPathEffect(new CornerPathEffect(360)); mPaintCricle.setAntiAlias(true); PorterDuffXfermode mode = new PorterDuffXfermode(PorterDuff.Mode.XOR); mPaintCricle.setXfermode(mode); matrix = new Matrix(); mBitmapBackGround = BitmapFactory.decodeResource(getResources(), R.mipmap.kobe); } @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); matrix.reset(); matrix.postScale((width+0.0f)/mBitmapBackGround.getWidth(),(height+0.0f)/mBitmapBackGround.getHeight()); } private Canvas canvasBit; @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(mBitmapBackGround, matrix, null); canvasBit.drawRect(0, 0, width, height, mPaintRect); canvasBit.drawPath(path, mPaintCricle); canvas.drawBitmap(mBitmap, 0, 0, null); } float x; float y; float old_x; float old_y; @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(); path.quadTo((x+old_x)/2,(y+old_y)/2,x,y); invalidate(); old_x = x; old_y = y; return true; } return super.onTouchEvent(event); }}
保存图片
package com.example.administrator.myviewdemo;import android.app.Activity;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.Button;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class MainActivity extends Activity { private Button mButtonSave; private MyBitmapView2 myBitmapView2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButtonSave = (Button) findViewById(R.id.button_save); myBitmapView2 = (MyBitmapView2) findViewById(R.id.mybitmapview); mButtonSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { myBitmapView2.setDrawingCacheEnabled(true); Bitmap bitmap = myBitmapView2.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(); } } }); }}
自定义属性
属性也是可以自定义的,在values文件夹下写一个xml文件,名字自定,如下,定义两个属性背景和宽度的值,并在layout下写给出,最后在java代码里调用。
<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="myview"> <attr name="myview_background" format="reference"></attr> <attr name="myview_paintwidth" format="dimension|reference"></attr> </declare-styleable></resources>
自定义的名字是myview,在下面的布局文件中用到,主要是:
xmlns:myview=”http://schemas.android.com/apk/res-auto”
myview:myview_background=”@mipmap/aa”
myview:myview_paintwidth=”60dp”/>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:myview="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <Button android:id="@+id/button_save" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存图片"/><com.example.administrator.myviewdemo.MyBitmapView2 android:id="@+id/mybitmapview" android:layout_width="match_parent" android:layout_height="match_parent" myview:myview_background="@mipmap/aa" myview:myview_paintwidth="60dp"/></LinearLayout>
在java代码中调用
public MyBitmapView2(Context context, AttributeSet attrs) { super(context, attrs); mPaintCricle = new Paint(); final TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.myview); BitmapDrawable dra = (BitmapDrawable) a.getDrawable(R.styleable.myview_myview_background); if (dra!=null){ mBitmapBackGround = dra.getBitmap(); }else { mBitmapBackGround = BitmapFactory.decodeResource(getResources(), R.mipmap.kobe); } int paintWidth = a.getDimensionPixelOffset(R.styleable.myview_myview_paintwidth,30); mPaintCricle.setStrokeWidth(paintWidth);
加速球的波动
package com.example.administrator.myviewdemo.MyView;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.graphics.PorterDuff;import android.graphics.PorterDuffXfermode;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.view.View;/** * Created by Administrator on 2015/9/17. */public class MyBubbleView extends View { private int width; private int height; private Paint mPaint; private Paint mPaintCricle; private Bitmap mPaintBubble; private Path path; public static final int NEED_INVALIDATE = 0X23; private int count = 0; private Canvas canvasBit ; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what){ case NEED_INVALIDATE: count+=5; if (count>80){ count=0; } invalidate();//告诉UI主线程重新绘制 handler.sendEmptyMessageDelayed(NEED_INVALIDATE,100); break; } } }; public MyBubbleView(Context context) { super(context); } public MyBubbleView(Context context, AttributeSet attrs) { super(context, attrs); path = new Path(); mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setColor(Color.BLUE); mPaint.setStyle(Paint.Style.FILL); mPaintCricle = new Paint(); mPaintCricle.setColor(Color.RED); mPaintCricle.setStyle(Paint.Style.FILL); mPaintCricle.setStrokeWidth(3); PorterDuffXfermode mode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN); mPaint.setXfermode(mode); handler.sendEmptyMessage(NEED_INVALIDATE); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); width = getDefaultSize(getSuggestedMinimumWidth(),widthMeasureSpec); height = getDefaultSize(getSuggestedMinimumHeight(),heightMeasureSpec); setMeasuredDimension(width, height); mPaintBubble = Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888); canvasBit = new Canvas(mPaintBubble); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.argb(0xff, 0x08, 0x7e, 0x72)); canvasBit.drawCircle(300,300,150, mPaintCricle); path.reset(); path.moveTo(500, 200); path.lineTo(500,500); path.lineTo(count,500); path.lineTo(count,200); for (int i = 0;i<10;i++){ path.rQuadTo(20,5,40,0);//rQuadTo是以moveTo到的点为原点,接着确定两个点 path.rQuadTo(20, -5, 40, 0); } path.close(); canvasBit.drawPath(path,mPaint); canvas.drawBitmap(mPaintBubble,0,0,null);// canvas.drawRect(100,0,200,200,mPaintPoint); }}
0 0
- OnTouchEvent、 自定义属性
- 自定义view基础,onMeasure,onDraw,onTouchEvent,自定义属性
- 自定义ImageView重写onTouchEvent
- 自定义ImageView重写onTouchEvent
- 【自定义之前】自定义之前:onTouchEvent
- 【自定义之前】自定义之前:onTouchEvent
- 自定义onTouchEvent之ACTION…
- android View属性之dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent
- onTouchEvent
- onTouchEvent()
- OnTouchEvent
- onTouchEvent
- 自定义onTouchEvent之ACTION_MOVE不响应
- android-自定义ViewGroup与onTouchEvent监听-随心
- 自定义onTouchEvent之ACTION_MOVE不响应
- 自定义控件(29)---onTouchEvent与Scroller
- 自定义控件中onInterceptTouchEvent()和onTouchEvent()用法
- 自定义属性
- 数据结构与算法分析(c++版) #6 双链表
- 我的求职路
- linux shell — 2.Linux的档案属性和目录配置
- hdu1669杰米的电话联系人(多重匹配)
- 欢迎使用CSDN-markdown编辑器
- OnTouchEvent、 自定义属性
- apk在launcher配置多个icon启动入口
- 黑马程序员_java基础_多线程
- POJ 3126 Pime Path bfs
- GridViewAdapter
- hdu 1285
- ajax全接触--imooc
- 黑马程序员_java学习笔记 9. 正则表达式
- POJ 1087 A Plug for UNIX (网络流)