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
原创粉丝点击