安卓开发_慕课网_百度地图_刮刮涂层效果

学习内容来自“慕课网”

很多电商APP中都有刮刮卡活动,刮开涂层,获取刮刮卡内部信息

原理图:

刮刮卡效果:通过画笔画笔来实现,黄色涂层,蓝色涂层,刮动则将两涂层共有的部分去掉,   就是DstOut对应的 效果

MainActivity.java

 1 package com.example.gauguaka;
 2
 3 import android.os.Bundle;
 4 import android.app.Activity;
 5 import android.view.Menu;
 6
 7 public class MainActivity extends Activity {
 8
 9     @Override
10     protected void onCreate(Bundle savedInstanceState) {
11         super.onCreate(savedInstanceState);
12         setContentView(R.layout.activity_main);
13     }
14
15
16 }

新建一个包guaguaka.java 在包中新建类Guaguaka.java

  1 package guaguaka.view;
  2
  3 import com.example.gauguaka.R;
  4
  5 import android.content.Context;
  6 import android.graphics.Bitmap;
  7 import android.graphics.Bitmap.Config;
  8 import android.graphics.BitmapFactory;
  9 import android.graphics.Canvas;
 10 import android.graphics.Color;
 11 import android.graphics.Paint;
 12 import android.graphics.Paint.Style;
 13 import android.graphics.Path;
 14 import android.graphics.PorterDuff.Mode;
 15 import android.graphics.PorterDuffXfermode;
 16 import android.util.AttributeSet;
 17 import android.view.MotionEvent;
 18 import android.view.View;
 19
 20 public class Guaguaka extends View{
 21     //画笔
 22     private Paint moutterpaint;
 23     //记录绘制路径
 24     private Path mpath;
 25     //画布
 26     private Canvas mcanvas;
 27     //图片
 28     private Bitmap mbitmap;
 29     //绘制坐标值
 30     private int mlastx;
 31     private int mlasty;
 32     /*----------------------*/
 33     private Bitmap bitmap;
 34
 35
 36
 37     public Guaguaka(Context context) {
 38         // TODO Auto-generated constructor stub
 39         this(context,null);
 40     }
 41     public Guaguaka(Context context, AttributeSet attrs) {
 42         this(context, attrs,0);
 43         // TODO Auto-generated constructor stub
 44     }
 45     public Guaguaka(Context context, AttributeSet attrs,int defStyle) {
 46         super(context, attrs ,defStyle);
 47         // TODO Auto-generated constructor stub
 48         init();
 49     }
 50     //获得控件的宽度和高度
 51     @Override
 52     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 53         // TODO Auto-generated method stub
 54         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 55
 56         int width = getMeasuredWidth();
 57         int height = getMeasuredHeight();
 58         // 初始化我们的bitmap
 59         mbitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
 60         mcanvas = new Canvas(mbitmap);
 61         // 设置绘制path画笔的一些属性
 62         setupOutPaint();
 63         //setUpBackPaint();
 64         mcanvas.drawColor(Color.parseColor("#c0c0c0"));
 65
 66     }
 67     //初始化操作
 68     private void init() {
 69         // TODO Auto-generated method stub
 70         moutterpaint = new Paint();
 71         mpath = new Path();
 72         //刮开后的图片
 73         bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.fg_guaguaka);
 74         }
 75     /**
 76      * 设置绘制path画笔的一些属性
 77      */
 78     private void setupOutPaint()
 79     {
 80         //画笔颜色 --红色
 81         moutterpaint.setColor(Color.parseColor("#c0c0c0"));
 82         //锯齿
 83         moutterpaint.setAntiAlias(true);
 84         moutterpaint.setDither(true);
 85         //线条圆角
 86         moutterpaint.setStrokeJoin(Paint.Join.ROUND);
 87         moutterpaint.setStrokeCap(Paint.Cap.ROUND);
 88         moutterpaint.setStyle(Style.FILL);
 89         //画笔宽度
 90         moutterpaint.setStrokeWidth(20);
 91     }
 92     /**
 93      * 设置我们绘制获奖信息的画笔属性
 94      */
 95
 96     //绘制事件
 97     @Override
 98     public boolean onTouchEvent(MotionEvent event)
 99     {
100         int action = event.getAction();
101
102         int x = (int) event.getX();
103         int y = (int) event.getY();
104
105         switch (action)
106         {
107         case MotionEvent.ACTION_DOWN://按下
108
109             mlastx = x;
110             mlasty = y;
111             mpath.moveTo(mlastx, mlasty);
112             break;
113         case MotionEvent.ACTION_MOVE://移动
114
115             int dx = Math.abs(x - mlastx);
116             int dy = Math.abs(y - mlasty);
117
118             if (dx > 3 || dy > 3)
119             {
120                 mpath.lineTo(x, y);
121             }
122             //更新坐标
123             mlastx = x;
124             mlasty = y;
125
126             break;
127         case MotionEvent.ACTION_UP://抬起
128
129             break;
130         }
131
132             invalidate();
133         return true;
134
135     }
136     @Override
137     protected void onDraw(Canvas canvas)
138     {
139             canvas.drawBitmap(bitmap, 0 , 0, null);
140
141
142             drawPath();
143             canvas.drawBitmap(mbitmap, 0, 0, null);
144         }
145
146     private void drawPath()
147     {
148         moutterpaint.setStyle(Style.STROKE);
149         moutterpaint.setXfermode(new PorterDuffXfermode(Mode.DST_OUT));
150         mcanvas.drawPath(mpath, moutterpaint);
151     }
152
153 }

Guaguaka.java

将布局文件修改:

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     >
 6
 7  <guaguaka.view.Guaguaka
 8         android:id="@+id/id_guaguaka"
 9         android:layout_width="300dp"
10         android:layout_height="100dp"
11         android:layout_centerInParent="true"
12         />
13 </RelativeLayout>

activity_main.xml

效果图:

时间: 2024-10-09 14:49:24

安卓开发_慕课网_百度地图_刮刮涂层效果的相关文章

安卓开发_慕课网_百度地图_添加覆盖物

学习内容来自“慕课网” 本片学习内容接自前四篇基础 安卓开发_慕课网_百度地图 安卓开发_慕课网_百度地图_实现定位 安卓开发_慕课网_百度地图_实现方向传感器 安卓开发_慕课网_百度地图_实现模式转换 请先学习前4篇再学习本篇,因为本篇在前四篇的基础上进行代码的编写 一.新建一个类用来存放数据(距离,点赞数,介绍图等信息) 1 package com.example.map; 2 3 import java.io.Serializable; 4 import java.util.ArrayLi

安卓开发_慕课网_百度地图_实现模式转换

学习内容来自“慕课网” 模式转换,即地图的普通模式,罗盘模式,跟随模式之间的转换 学习内容接自前三篇 安卓开发_慕课网_百度地图 安卓开发_慕课网_百度地图_实现定位 安卓开发_慕课网_百度地图_实现方向传感器 一.模式转换通过菜单按钮来控制 所以添加对应的菜单项(红色字体部分) 1 <menu xmlns:android="http://schemas.android.com/apk/res/android" > 2 3 <item 4 android:id=&qu

安卓开发_慕课网_百度地图_实现方向传感器

学习内容来自“慕课网” 这里学习百度地图方向传感器功能 就是当转动手机的时候,地图上显示个人所在位置的图标的箭头变动 学习接自前两篇 安卓开发_慕课网_百度地图 安卓开发_慕课网_百度地图_实现定位 思路: 传感器随着定位的开始而开启,随着定位的结束而结束 传感器获得位置的移动而更新方向 代码在前两篇的基础上修改 一.讲原本坐标的图标改成箭头图标 二.引入方向传感器 首先增添MainActivity.java中的自定义图标和方向传感器代码 看红色字体的部分 1 package com.examp

安卓开发_慕课网_百度地图

学习内容来自“慕课网” 百度地图sdk下载 http://developer.baidu.com/ http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=9554&extra=page%3D1 1.获取秘钥 应用名称随便写,应用类型:android sdk 这里有一个 安全码  百度给了提示:Android SDK安全码组成:数字签名+;+包名. 数字签名获取方法:点击菜单栏最后面的Window 里面的最后一个 Preferenc

安卓开发_慕课网_百度地图_实现定位

学习内容来自“慕课网” 在上一学习内容的基础上改进代码,需要学习定位功能的同学请先将我的上一篇百度地图基础的学习一下 http://www.cnblogs.com/xqxacm/p/4337054.html 第一次学习百度地图的定位功能,理解不深,相应注释都在代码中写出了 MainActivity.java 1 package com.example.map; 2 3 import com.baidu.location.BDLocation; 4 import com.baidu.locatio

安卓开发_慕课网_Fragment实现Tab(App主界面)

学习内容来自“慕课网” 这里用Fragment来实现APP主界面 思路: 底部横向排列4个LinearLayout,每个LinearLayout包含一个图片按钮和一个文字 1.默认显示第一个功能(微信)的图标为亮,其他三个为暗 2.点击相应的按钮,首先将所有的图标变暗,接着隐藏所有Fragment,再把点击的对应的Fragment显示出来,并把相应的图标显示亮 首先布局文件 activity_main.xml与ViewPager实现Tab的是不一样的 1 <LinearLayout xmlns:

安卓开发_慕课网_ViewPager实现Tab(App主界面)

学习内容来自“慕课网” 网站上一共有4种方法来实现APP主界面的TAB方法 这里学习第一种 ViewPager实现Tab 布局文件有7个, 主界面acitivity.layout 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_w

安卓开发_慕课网_ViewPager切换动画(3.0版本以上有效果)

学习内容来自“慕课网” 一般APP进去之后都会有几张图片来导航,这里就学习怎么在这张图片切换的时候添加切换动画效果 先看布局文件 activity_main.layout <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_widt

安卓开发_慕课网_ViewPager与FragmentPagerAdapter实现Tab实现Tab(App主界面)

学习内容来自“慕课网” ViewPager与FragmentPagerAdapter实现Tab 将这两种实现Tab的方法结合起来.效果就是可以拖动内容区域来改变相应的功能图标亮暗 思路: Fragment作为内容区域 点击功能按钮,想将所有的图标变为暗色图标,再调用相应的Fragment,并使对应的图标变亮 效果图: 布局文件部分 activity_main.xml 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/