From a9688017b499da20469aa193bada19104043cfc6 Mon Sep 17 00:00:00 2001 From: Flyge Date: Sat, 9 Dec 2017 01:18:25 +0800 Subject: [PATCH] :bookmark: Released 1.2.0 --- .gitignore | 4 +- README.md | 100 ++++++----- RubberView.iml | 19 -- app/app.iml | 66 ------- app/build.gradle | 24 --- app/src/main/AndroidManifest.xml | 20 --- .../rubberview/sample/MainActivity.java | 34 ---- app/src/main/res/layout/activity_main.xml | 20 --- app/src/main/res/values/strings.xml | 4 - app/src/main/res/values/styles.xml | 8 - build.gradle | 11 +- docs/sample.png | Bin 16265 -> 27100 bytes gradle.properties | 11 +- gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 0 .../android-rubber-view-1.1.2-with-src.jar | Bin 10020 -> 0 bytes releases/android-rubber-view-1.1.2.jar | Bin 6766 -> 0 bytes sample/build.gradle | 26 +++ {app => sample}/proguard-rules.pro | 0 sample/src/main/AndroidManifest.xml | 30 ++++ {app => sample}/src/main/ic_launcher-web.png | Bin .../me/panpf/scratch/sample/MainActivity.java | 50 ++++++ .../main/res/drawable-hdpi/ic_launcher.png | Bin .../main/res/drawable-mdpi/ic_launcher.png | Bin .../main/res/drawable-xhdpi/ic_launcher.png | Bin .../main/res/drawable-xxhdpi/ic_launcher.png | Bin sample/src/main/res/layout/activity_main.xml | 31 ++++ sample/src/main/res/values/colors.xml | 16 ++ sample/src/main/res/values/strings.xml | 14 ++ sample/src/main/res/values/styles.xml | 22 +++ scratch-award-view/build.gradle | 23 +++ scratch-award-view/proguard-rules.pro | 17 ++ scratch-award-view/project.properties | 10 ++ .../src/main/AndroidManifest.xml | 15 ++ .../me/panpf/scratch/ScratchAwardView.java | 166 ++++++++++-------- settings.gradle | 2 +- 36 files changed, 419 insertions(+), 326 deletions(-) delete mode 100644 RubberView.iml delete mode 100644 app/app.iml delete mode 100644 app/build.gradle delete mode 100644 app/src/main/AndroidManifest.xml delete mode 100644 app/src/main/java/me/xiaopan/android/rubberview/sample/MainActivity.java delete mode 100644 app/src/main/res/layout/activity_main.xml delete mode 100644 app/src/main/res/values/strings.xml delete mode 100644 app/src/main/res/values/styles.xml mode change 100644 => 100755 gradlew delete mode 100644 releases/android-rubber-view-1.1.2-with-src.jar delete mode 100644 releases/android-rubber-view-1.1.2.jar create mode 100644 sample/build.gradle rename {app => sample}/proguard-rules.pro (100%) create mode 100644 sample/src/main/AndroidManifest.xml rename {app => sample}/src/main/ic_launcher-web.png (100%) create mode 100644 sample/src/main/java/me/panpf/scratch/sample/MainActivity.java rename {app => sample}/src/main/res/drawable-hdpi/ic_launcher.png (100%) rename {app => sample}/src/main/res/drawable-mdpi/ic_launcher.png (100%) rename {app => sample}/src/main/res/drawable-xhdpi/ic_launcher.png (100%) rename {app => sample}/src/main/res/drawable-xxhdpi/ic_launcher.png (100%) create mode 100644 sample/src/main/res/layout/activity_main.xml create mode 100644 sample/src/main/res/values/colors.xml create mode 100644 sample/src/main/res/values/strings.xml create mode 100644 sample/src/main/res/values/styles.xml create mode 100644 scratch-award-view/build.gradle create mode 100644 scratch-award-view/proguard-rules.pro create mode 100644 scratch-award-view/project.properties create mode 100644 scratch-award-view/src/main/AndroidManifest.xml rename app/src/main/java/me/xiaopan/android/widget/RubberView.java => scratch-award-view/src/main/java/me/panpf/scratch/ScratchAwardView.java (65%) diff --git a/.gitignore b/.gitignore index de0f16a..72b147d 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,6 @@ gen/ # Gradle files .gradle/ -build/ \ No newline at end of file +build/ + +*.iml \ No newline at end of file diff --git a/README.md b/README.md index aebdbdb..6867797 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,33 @@ -# ![Logo](https://github.com/xiaopansky/RubberView/raw/master/app/src/main/res/drawable-mdpi/ic_launcher.png) RubberView +# ![logo_image] ScratchAwardView -这是Android上的一个涂抹视图,用于实现刮奖效果 +![Platform][platform_image] +[![API][min_api_image]][min_api_link] +[![Release Version][release_version_image]][release_version-link] -![Sample](https://github.com/xiaopansky/RubberView/raw/master/docs/sample.png) +这是一个刮刮卡组件,用于实现刮奖效果 + +![Sample](docs/sample.png) + +## 开始使用 + +### 1. 导入 ScratchAwardView + +在 app 的 build.gradle 文件的 dependencies 节点中加入依赖 + +```groovy +dependencies{ + implementation 'me.panpf:scratch-award-view:$lastVersionName' +} +``` + +请自行替换 `$lastVersionName` 为最新的版本:[![Release Version][release_version_image]][release_version-link] `(不要v)` + +最低支持 `Android 2.3` + +### 2. 在布局中使用 + +你只需将 ScratchAwardView 覆盖在中奖提示语之上即可,这样的用法很灵活,因此你可以决定你的中奖提示语是一段文字或者一张图片,如下所示: -##Usage guide -你只需将RubberView覆盖在中奖提示语之上即可,这样的用法很灵活,因此你可以决定你的中奖提示语是一段文字或者一张图片,如下所示: ```xml - ``` + 扩展功能: ->* 调用setMaskImage()方法自定义遮罩图片,默认的是灰色 ->* 调用setStrokeWidth()方法自定义画笔宽度 ->* 调用enableAcrossMonitor()方法监听用户划过的区域,你可以指定一个隐藏在RubberView下面的视图,当用户划过这个视图的时候就会触发回调 - -##Downloads ->* [android-rubber-view-1.1.2.jar](https://github.com/xiaopansky/RubberView/raw/master/releases/android-rubber-view-1.1.2.jar) ->* [android-rubber-view-1.1.2-with-src.jar](https://github.com/xiaopansky/RubberView/raw/master/releases/android-rubber-view-1.1.2-with-src.jar) - -##Change log - -####1.1.2 ->* 修复单击事件不灵敏的BUG ->* RubberView包名改为me.xiaopan.android.widget - -####1.1.1 ->* 修复当被ScrollView包括时,无法正常滑动的BUG - -####1.1.0 ->* 增加enableAcrossMonitor()方法,用于监听用户的滑动操作,实现滑过指定视图的时候触发回调 - -##License -```java -/* - * Copyright (C) 2013 Peng fei Pan - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -``` +* 调用 setMaskImage() 方法自定义遮罩图片,默认的是灰色 +* 调用 setStrokeWidth() 方法自定义画笔宽度 +* 调用 enableAcrossMonitor() 方法监听用户划过的区域,你可以指定一个隐藏在 ScratchAwardView 下面的视图,当用户划过这个视图的时候就会触发回调 + +## License + Copyright (C) 2017 Peng fei Pan + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +[logo_image]: sample/src/main/res/drawable-mdpi/ic_launcher.png +[platform_image]: https://img.shields.io/badge/Platform-Android-brightgreen.svg +[min_api_image]: https://img.shields.io/badge/API-10%2B-orange.svg +[min_api_link]: https://android-arsenal.com/api?level=10 +[release_version_image]: https://img.shields.io/github/release/panpf/scratch-award-view.svg +[release_version-link]: https://github.com/panpf/scratch-award-view/releases diff --git a/RubberView.iml b/RubberView.iml deleted file mode 100644 index 0bb6048..0000000 --- a/RubberView.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/app/app.iml b/app/app.iml deleted file mode 100644 index 5e9236d..0000000 --- a/app/app.iml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index aa4d2fc..0000000 --- a/app/build.gradle +++ /dev/null @@ -1,24 +0,0 @@ -apply plugin: 'android' - -android { - compileSdkVersion 19 - buildToolsVersion "19.1.0" - - defaultConfig { - applicationId "me.xiaopan.android.rubberview" - minSdkVersion 9 - targetSdkVersion 19 - versionCode 112 - versionName "1.1.2" - } - buildTypes { - release { - runProguard false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - -dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml deleted file mode 100644 index 5a7389d..0000000 --- a/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - diff --git a/app/src/main/java/me/xiaopan/android/rubberview/sample/MainActivity.java b/app/src/main/java/me/xiaopan/android/rubberview/sample/MainActivity.java deleted file mode 100644 index 0ab6769..0000000 --- a/app/src/main/java/me/xiaopan/android/rubberview/sample/MainActivity.java +++ /dev/null @@ -1,34 +0,0 @@ -package me.xiaopan.android.rubberview.sample; - -import android.app.Activity; -import android.os.Bundle; -import android.view.View; - -import me.xiaopan.android.rubberview.R; -import me.xiaopan.android.widget.RubberView; - -public class MainActivity extends Activity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - final RubberView rubberView = (RubberView) findViewById(R.id.rubberView_main); - rubberView.enableAcrossMonitor(findViewById(R.id.text_main), new RubberView.OnAcrossHintViewListener() { - private boolean across; - @Override - public void onAcrossHintView(View hintView) { - if(!across){ - across = true; - rubberView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finish(); - } - }); - } - } - }); - } -} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index a5ab20a..0000000 --- a/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml deleted file mode 100644 index b1dbc64..0000000 --- a/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - RubberView - diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml deleted file mode 100644 index ff6c9d2..0000000 --- a/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - diff --git a/build.gradle b/build.gradle index a1d991f..a98c871 100644 --- a/build.gradle +++ b/build.gradle @@ -2,11 +2,13 @@ buildscript { repositories { - mavenCentral() + jcenter() + maven { url 'https://dl.google.com/dl/android/maven2/' } } dependencies { - classpath 'com.android.tools.build:gradle:0.12.+' - + classpath 'com.android.tools.build:gradle:3.0.0' + classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' + classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } @@ -14,6 +16,7 @@ buildscript { allprojects { repositories { - mavenCentral() + jcenter() + maven { url 'https://dl.google.com/dl/android/maven2/' } } } diff --git a/docs/sample.png b/docs/sample.png index 0391476968aa740302e9b7e716e10c7de5832eca..a8b6c8042d13d02f8bc0f36c154913ec7e51d45c 100644 GIT binary patch literal 27100 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 TJp}HM03TgVxJH$lUD*EsE^XB9 literal 16265 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 diff --git a/gradle.properties b/gradle.properties index 5d08ba7..87971af 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,4 +15,13 @@ # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true \ No newline at end of file +# org.gradle.parallel=true + +COMPILE_SDK_VERSION=25 +MIN_SDK_VERSION=10 +TARGET_SDK_VERSION=22 + +VERSION_CODE=120 +VERSION_NAME=1.2.0 + +ANDROID_SUPPORT_LIBRARY_VERSION=25.3.0 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1ef2911..7ed8429 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=http\://services.gradle.org/distributions/gradle-1.12-all.zip +distributionUrl=http\://services.gradle.org/distributions/gradle-4.1-all.zip diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/releases/android-rubber-view-1.1.2-with-src.jar b/releases/android-rubber-view-1.1.2-with-src.jar deleted file mode 100644 index 39c31809746acb8966b24fad0626b7447d0bfa98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10020 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 + + + + + + + + + + + + + + diff --git a/app/src/main/ic_launcher-web.png b/sample/src/main/ic_launcher-web.png similarity index 100% rename from app/src/main/ic_launcher-web.png rename to sample/src/main/ic_launcher-web.png diff --git a/sample/src/main/java/me/panpf/scratch/sample/MainActivity.java b/sample/src/main/java/me/panpf/scratch/sample/MainActivity.java new file mode 100644 index 0000000..ffc62bf --- /dev/null +++ b/sample/src/main/java/me/panpf/scratch/sample/MainActivity.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2017 Peng fei Pan + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.panpf.scratch.sample; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.View; + +import me.panpf.scratch.ScratchAwardView; + +public class MainActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + final ScratchAwardView scratchAwardView = (ScratchAwardView) findViewById(R.id.rubberView_main); + scratchAwardView.enableAcrossMonitor(findViewById(R.id.text_main), new ScratchAwardView.OnAcrossHintViewListener() { + private boolean across; + + @Override + public void onAcrossHintView(View hintView) { + if (!across) { + across = true; + scratchAwardView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + } + }); + } +} diff --git a/app/src/main/res/drawable-hdpi/ic_launcher.png b/sample/src/main/res/drawable-hdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_launcher.png rename to sample/src/main/res/drawable-hdpi/ic_launcher.png diff --git a/app/src/main/res/drawable-mdpi/ic_launcher.png b/sample/src/main/res/drawable-mdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_launcher.png rename to sample/src/main/res/drawable-mdpi/ic_launcher.png diff --git a/app/src/main/res/drawable-xhdpi/ic_launcher.png b/sample/src/main/res/drawable-xhdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_launcher.png rename to sample/src/main/res/drawable-xhdpi/ic_launcher.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/sample/src/main/res/drawable-xxhdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_launcher.png rename to sample/src/main/res/drawable-xxhdpi/ic_launcher.png diff --git a/sample/src/main/res/layout/activity_main.xml b/sample/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..67201fe --- /dev/null +++ b/sample/src/main/res/layout/activity_main.xml @@ -0,0 +1,31 @@ + + + + + + + \ No newline at end of file diff --git a/sample/src/main/res/values/colors.xml b/sample/src/main/res/values/colors.xml new file mode 100644 index 0000000..19d0822 --- /dev/null +++ b/sample/src/main/res/values/colors.xml @@ -0,0 +1,16 @@ + + + + #3F51B5 + #303F9F + #FF4081 + \ No newline at end of file diff --git a/sample/src/main/res/values/strings.xml b/sample/src/main/res/values/strings.xml new file mode 100644 index 0000000..3171b3e --- /dev/null +++ b/sample/src/main/res/values/strings.xml @@ -0,0 +1,14 @@ + + + + ScratchAwardView + diff --git a/sample/src/main/res/values/styles.xml b/sample/src/main/res/values/styles.xml new file mode 100644 index 0000000..39e6585 --- /dev/null +++ b/sample/src/main/res/values/styles.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/scratch-award-view/build.gradle b/scratch-award-view/build.gradle new file mode 100644 index 0000000..cec29b9 --- /dev/null +++ b/scratch-award-view/build.gradle @@ -0,0 +1,23 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion COMPILE_SDK_VERSION.toInteger() + + defaultConfig { + minSdkVersion MIN_SDK_VERSION.toInteger() + targetSdkVersion TARGET_SDK_VERSION.toInteger() + versionCode VERSION_CODE.toInteger() + versionName VERSION_NAME + + consumerProguardFiles 'proguard-rules.pro' + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +apply from: "https://raw.githubusercontent.com/panpf/android-library-publish-to-jcenter/master/bintrayUpload.gradle" diff --git a/scratch-award-view/proguard-rules.pro b/scratch-award-view/proguard-rules.pro new file mode 100644 index 0000000..f142320 --- /dev/null +++ b/scratch-award-view/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in D:\Program Files\Android\android-sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/scratch-award-view/project.properties b/scratch-award-view/project.properties new file mode 100644 index 0000000..d07a605 --- /dev/null +++ b/scratch-award-view/project.properties @@ -0,0 +1,10 @@ +#project +project.name=scratch-award-view +project.groupId=me.panpf +project.artifactId=scratch-award-view +project.packaging=aar +project.siteUrl=https://github.com/panpf/scratch-award-view +project.gitUrl=https://github.com/panpf/scratch-award-view.git + +#javadoc +javadoc.name=ScratchAwardView \ No newline at end of file diff --git a/scratch-award-view/src/main/AndroidManifest.xml b/scratch-award-view/src/main/AndroidManifest.xml new file mode 100644 index 0000000..40091e7 --- /dev/null +++ b/scratch-award-view/src/main/AndroidManifest.xml @@ -0,0 +1,15 @@ + + + + + + diff --git a/app/src/main/java/me/xiaopan/android/widget/RubberView.java b/scratch-award-view/src/main/java/me/panpf/scratch/ScratchAwardView.java similarity index 65% rename from app/src/main/java/me/xiaopan/android/widget/RubberView.java rename to scratch-award-view/src/main/java/me/panpf/scratch/ScratchAwardView.java index 783625f..459ab8b 100644 --- a/app/src/main/java/me/xiaopan/android/widget/RubberView.java +++ b/scratch-award-view/src/main/java/me/panpf/scratch/ScratchAwardView.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 Peng fei Pan + * Copyright (C) 2017 Peng fei Pan * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,8 +14,9 @@ * limitations under the License. */ -package me.xiaopan.android.widget; +package me.panpf.scratch; +import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -32,9 +33,9 @@ import android.view.View; import android.widget.ImageView; -public class RubberView extends View{ +public class ScratchAwardView extends View { private Paint drawPaint; - private Bitmap trackBitmap; // 轨迹图片,一会儿要在此图片上画滑动轨迹,然后通过Xfermode技术同遮罩层图片融合就能实现涂抹的效果 + private Bitmap trackBitmap; // 轨迹图片,一会儿要在此图片上画滑动轨迹,然后通过 Xfermode 技术同遮罩层图片融合就能实现涂抹的效果 private Canvas trackBitmapCanvas; private Xfermode xfermode; private Paint linePaint; // 触摸轨迹线画笔 @@ -49,15 +50,15 @@ public class RubberView extends View{ private GestureDetector gestureDetector; - public RubberView(Context context) { + public ScratchAwardView(Context context) { this(context, null, 0); } - public RubberView(Context context, AttributeSet attrs) { + public ScratchAwardView(Context context, AttributeSet attrs) { this(context, attrs, 0); } - public RubberView(Context context, AttributeSet attrs, int defStyleAttr) { + public ScratchAwardView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); drawPaint = new Paint(); @@ -76,15 +77,61 @@ public RubberView(Context context, AttributeSet attrs, int defStyleAttr) { gestureDetector = new GestureDetector(getContext(), new EventHandleListener()); } + public static Rect computeSrcRect(Point sourceSize, Point targetSize, ImageView.ScaleType scaleType) { + if (scaleType == ImageView.ScaleType.CENTER_INSIDE || scaleType == ImageView.ScaleType.MATRIX || scaleType == ImageView.ScaleType.FIT_XY) { + return new Rect(0, 0, sourceSize.x, sourceSize.y); + } else { + float scale; + if (Math.abs(sourceSize.x - targetSize.x) < Math.abs(sourceSize.y - targetSize.y)) { + scale = (float) sourceSize.x / targetSize.x; + if ((int) (targetSize.y * scale) > sourceSize.y) { + scale = (float) sourceSize.y / targetSize.y; + } + } else { + scale = (float) sourceSize.y / targetSize.y; + if ((int) (targetSize.x * scale) > sourceSize.x) { + scale = (float) sourceSize.x / targetSize.x; + } + } + int srcLeft; + int srcTop; + int srcWidth = (int) (targetSize.x * scale); + int srcHeight = (int) (targetSize.y * scale); + if (scaleType == ImageView.ScaleType.FIT_START) { + srcLeft = 0; + srcTop = 0; + } else if (scaleType == ImageView.ScaleType.FIT_END) { + if (sourceSize.x > sourceSize.y) { + srcLeft = sourceSize.x - srcWidth; + srcTop = 0; + } else { + srcLeft = 0; + srcTop = sourceSize.y - srcHeight; + } + } else { + if (sourceSize.x > sourceSize.y) { + srcLeft = (sourceSize.x - srcWidth) / 2; + srcTop = 0; + } else { + srcLeft = 0; + srcTop = (sourceSize.y - srcHeight) / 2; + } + } + return new Rect(srcLeft, srcTop, srcLeft + srcWidth, srcTop + srcHeight); + } + } + @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); - int layerCount = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG); + @SuppressLint("WrongConstant") + int layerCount = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, + Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG); canvas.drawBitmap(trackBitmap, getPaddingLeft(), getPaddingTop(), drawPaint); drawPaint.setXfermode(xfermode); canvas.drawBitmap(maskBitmap, srcRect, dstRect, drawPaint); drawPaint.setXfermode(null); - if(!isInEditMode()){ + if (!isInEditMode()) { canvas.restoreToCount(layerCount); } } @@ -93,31 +140,31 @@ protected void onDraw(Canvas canvas) { protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); - int width = right-left; - int height = bottom-top; + int width = right - left; + int height = bottom - top; // 初始化轨迹图片,稍后将在此图上绘制触摸轨迹 - if(trackBitmap == null){ - trackBitmap = Bitmap.createBitmap(width-getPaddingRight()-getPaddingLeft(), height-getPaddingBottom()-getPaddingTop(), Bitmap.Config.ARGB_8888); + if (trackBitmap == null) { + trackBitmap = Bitmap.createBitmap(width - getPaddingRight() - getPaddingLeft(), height - getPaddingBottom() - getPaddingTop(), Bitmap.Config.ARGB_8888); trackBitmapCanvas = new Canvas(trackBitmap); - // 如果已经创建了但是宽高有变化就重新创建 - }else if(trackBitmap.getWidth() != width-getPaddingRight()-getPaddingLeft() || trackBitmap.getHeight() != height-getPaddingBottom()-getPaddingTop()){ + // 如果已经创建了但是宽高有变化就重新创建 + } else if (trackBitmap.getWidth() != width - getPaddingRight() - getPaddingLeft() || trackBitmap.getHeight() != height - getPaddingBottom() - getPaddingTop()) { trackBitmap.recycle(); - trackBitmap = Bitmap.createBitmap(width-getPaddingRight()-getPaddingLeft(), height-getPaddingBottom()-getPaddingTop(), Bitmap.Config.ARGB_8888); + trackBitmap = Bitmap.createBitmap(width - getPaddingRight() - getPaddingLeft(), height - getPaddingBottom() - getPaddingTop(), Bitmap.Config.ARGB_8888); trackBitmapCanvas.setBitmap(trackBitmap); } // 初始化遮罩图片 - if(maskBitmap == null){ - maskBitmap = Bitmap.createBitmap(width-getPaddingRight()-getPaddingLeft(), height-getPaddingBottom()-getPaddingTop(), Bitmap.Config.ARGB_8888); + if (maskBitmap == null) { + maskBitmap = Bitmap.createBitmap(width - getPaddingRight() - getPaddingLeft(), height - getPaddingBottom() - getPaddingTop(), Bitmap.Config.ARGB_8888); new Canvas(maskBitmap).drawColor(defaultMaskColor); } // 初始化dst位置 - if(dstRect == null){ - dstRect = new Rect(getPaddingLeft(), getPaddingTop(), width-getPaddingRight(), height-getPaddingBottom()); - }else{ - dstRect.set(getPaddingLeft(), getPaddingTop(), width-getPaddingRight(), height-getPaddingBottom()); + if (dstRect == null) { + dstRect = new Rect(getPaddingLeft(), getPaddingTop(), width - getPaddingRight(), height - getPaddingBottom()); + } else { + dstRect.set(getPaddingLeft(), getPaddingTop(), width - getPaddingRight(), height - getPaddingBottom()); } srcRect = computeSrcRect(new Point(maskBitmap.getWidth(), maskBitmap.getHeight()), new Point(dstRect.width(), dstRect.height()), ImageView.ScaleType.CENTER_CROP); @@ -130,8 +177,10 @@ public boolean onTouchEvent(MotionEvent event) { /** * 设置遮罩图片 + * * @param maskBitmap 遮罩图片 */ + @SuppressWarnings("unused") public void setMaskImage(Bitmap maskBitmap) { this.maskBitmap = maskBitmap; requestLayout(); @@ -139,12 +188,14 @@ public void setMaskImage(Bitmap maskBitmap) { /** * 设置遮罩图片 + * * @param color 遮罩图片的颜色,稍后将使用此颜色创建一张图片 */ + @SuppressWarnings("unused") public void setMaskImage(int color) { this.defaultMaskColor = color; - if(maskBitmap != null){ - if(!maskBitmap.isRecycled()){ + if (maskBitmap != null) { + if (!maskBitmap.isRecycled()) { maskBitmap.recycle(); } maskBitmap = null; @@ -154,71 +205,30 @@ public void setMaskImage(int color) { /** * 设置画笔的宽度 + * * @param strokeWidth 画笔的宽度 */ + @SuppressWarnings("unused") public void setStrokeWidth(int strokeWidth) { this.linePaint.setStrokeWidth(strokeWidth); } /** * 激活监听划过提示视图的功能 - * @param hintView 提示视图,当用户划过此视图的时候就会回调监听器,一般来说此视图应该是隐藏在RubberView之下的中奖提示视图 + * + * @param hintView 提示视图,当用户划过此视图的时候就会回调监听器,一般来说此视图应该是隐藏在 {@link ScratchAwardView} 之下的中奖提示视图 * @param onAcrossHintViewListener 当用户划过提示视图的时候就会回调此监听器 */ - public void enableAcrossMonitor(View hintView, OnAcrossHintViewListener onAcrossHintViewListener){ + public void enableAcrossMonitor(View hintView, OnAcrossHintViewListener onAcrossHintViewListener) { this.hintView = hintView; this.onAcrossHintViewListener = onAcrossHintViewListener; } - public static Rect computeSrcRect(Point sourceSize, Point targetSize, ImageView.ScaleType scaleType){ - if(scaleType == ImageView.ScaleType.CENTER_INSIDE || scaleType == ImageView.ScaleType.MATRIX || scaleType == ImageView.ScaleType.FIT_XY){ - return new Rect(0, 0, sourceSize.x, sourceSize.y); - }else{ - float scale; - if(Math.abs(sourceSize.x - targetSize.x) < Math.abs(sourceSize.y - targetSize.y)){ - scale = (float) sourceSize.x/targetSize.x; - if((int)(targetSize.y*scale) > sourceSize.y){ - scale = (float) sourceSize.y/targetSize.y; - } - }else{ - scale = (float) sourceSize.y/targetSize.y; - if((int)(targetSize.x*scale) > sourceSize.x){ - scale = (float) sourceSize.x/targetSize.x; - } - } - int srcLeft; - int srcTop; - int srcWidth = (int)(targetSize.x*scale); - int srcHeight = (int)(targetSize.y*scale); - if (scaleType == ImageView.ScaleType.FIT_START) { - srcLeft = 0; - srcTop = 0; - } else if (scaleType == ImageView.ScaleType.FIT_END) { - if(sourceSize.x > sourceSize.y){ - srcLeft = sourceSize.x - srcWidth; - srcTop = 0; - }else{ - srcLeft = 0; - srcTop = sourceSize.y - srcHeight; - } - } else { - if(sourceSize.x > sourceSize.y){ - srcLeft = (sourceSize.x - srcWidth)/2; - srcTop = 0; - }else{ - srcLeft = 0; - srcTop = (sourceSize.y - srcHeight)/2; - } - } - return new Rect(srcLeft, srcTop, srcLeft+srcWidth, srcTop+srcHeight); - } - } - - public interface OnAcrossHintViewListener{ - public void onAcrossHintView(View hintView); + public interface OnAcrossHintViewListener { + void onAcrossHintView(View hintView); } - private class EventHandleListener implements GestureDetector.OnGestureListener{ + private class EventHandleListener implements GestureDetector.OnGestureListener { private float downX; private float downY; private float moveX; @@ -228,7 +238,7 @@ private class EventHandleListener implements GestureDetector.OnGestureListener{ @Override public boolean onDown(MotionEvent event) { - if(getParent() != null){ + if (getParent() != null) { getParent().requestDisallowInterceptTouchEvent(true); } downX = event.getX(); @@ -244,7 +254,7 @@ public void onShowPress(MotionEvent e) { @Override public boolean onSingleTapUp(MotionEvent e) { - if(isEnabled() && isClickable()){ + if (isEnabled() && isClickable()) { performClick(); } return true; @@ -259,12 +269,12 @@ public boolean onScroll(MotionEvent e1, MotionEvent event, float distanceX, floa downY = moveY; invalidate(); - if(allowAcrossCallback){ - if(hintViewGlobalVisibleRect == null){ + if (allowAcrossCallback) { + if (hintViewGlobalVisibleRect == null) { hintViewGlobalVisibleRect = new Rect(); hintView.getGlobalVisibleRect(hintViewGlobalVisibleRect); } - if(hintViewGlobalVisibleRect.contains((int)event.getRawX(), (int)event.getRawY())){ + if (hintViewGlobalVisibleRect.contains((int) event.getRawX(), (int) event.getRawY())) { onAcrossHintViewListener.onAcrossHintView(hintView); allowAcrossCallback = false; } diff --git a/settings.gradle b/settings.gradle index e7b4def..f919000 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app' +include ':sample', "scratch-award-view"