├── .idea └── ant.xml ├── README.md ├── example.png ├── library ├── .DS_Store ├── AndroidManifest.xml ├── ShowcaseView.iml ├── project.properties ├── res │ ├── .DS_Store │ ├── drawable-hdpi │ │ ├── btn_cling_normal.9.png │ │ ├── btn_cling_pressed.9.png │ │ ├── cling.png │ │ └── ic_launcher.png │ ├── drawable-ldpi │ │ └── ic_launcher.png │ ├── drawable-mdpi │ │ ├── btn_cling_normal.9.png │ │ ├── btn_cling_pressed.9.png │ │ ├── cling.png │ │ └── ic_launcher.png │ ├── drawable-xhdpi │ │ ├── btn_cling_normal.9.png │ │ ├── btn_cling_pressed.9.png │ │ ├── cling.png │ │ └── ic_launcher.png │ ├── drawable │ │ └── cling_button_bg.xml │ ├── layout │ │ └── main.xml │ └── values │ │ ├── .DS_Store │ │ ├── attrs.xml │ │ ├── ids.xml │ │ ├── strings.xml │ │ └── styles.xml └── src │ └── com │ ├── .DS_Store │ └── espian │ └── showcaseview │ └── ShowcaseView.java └── sample ├── AndroidManifest.xml ├── Showcase Sample.iml ├── gen └── com │ └── espian │ └── showcaseview │ └── sample │ ├── BuildConfig.java │ ├── Manifest.java │ └── R.java ├── project.properties ├── res ├── drawable-hdpi │ └── ic_launcher.png ├── drawable-ldpi │ └── ic_launcher.png ├── drawable-mdpi │ └── ic_launcher.png ├── drawable-xhdpi │ └── ic_launcher.png ├── layout │ └── main.xml └── values │ ├── strings.xml │ └── styles.xml └── src └── com └── espian └── showcaseview └── sample └── SampleActivity.java /.idea/ant.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Showcase View library 2 | ==== 3 | 4 | The ShowcaseView library is designed to highlight and showcase specific parts of apps to the user with a distinctive and attractive overlay. This library is great for pointing out points of interest for users, or obscure but useful items. 5 | 6 | The library is based on the "Cling" view found in the Launcher on Ice-Cream Sandwich and Jelly Bean, but extended to be easier to use. 7 | 8 | ![Example image](https://raw.github.com/Espiandev/ShowcaseView/master/example.png) 9 | 10 | Usage 11 | ---- 12 | 13 | To achieve a full-screen overlay, place a ShowcaseView as high in your layout's view hierarchy as you can. To set the view to showcase, call `ShowcaseView.setShowcaseView(..)`. By default, the ShowcaseView will show every time the layout is shown, but this can be altered by calling `ShowcaseView.setShotType(..)` before `setShowcaseView(..)`. Using `TYPE_ONE_SHOT` will only show the ShowcaseView the first time the layout is shown. 14 | 15 | As ShowcaseView extends a RelativeLayout, you can add items to the ShowcaseView, such as a button to hide it or text to explain what you are showcasing. If you give the button the id "@id/showcase_button", it will, by default, close the ShowcaseView once pressed. This behaviour can be overridden by using `ShowcaseView.overrideButtonClick(..)`. 16 | 17 | Styles are included to maintain consistently in ShowcaseViews. Buttons should use the style ShowcaseButton, with title text using ShowcaseTitleText and standard text using ShowcaseText. 18 | 19 | By default, the ShowcaseView will block all touch events except inside the showcased circle. To override this, simply call `ShowcaseView.blockNonShowcasedTouches(false)`. 20 | 21 | Upcoming features 22 | ---- 23 | 24 | At the moment, this library is quite bare. However, I hope to add the following features very soon: 25 | - ~~Support for showcasing raw co-ordinates~~ _Use `setShowcasePosition(x,y)`_ 26 | - Support for showcasing ActionBar items 27 | - Variable sized circles for showcasing 28 | - Easier usage 29 | - ~~On-demand showing and hiding of ShowcaseView~~ _Use `show()` and `hide()`_ 30 | 31 | Copyright and Licensing 32 | ---- 33 | 34 | Copyright Alex Curran © 2012. All rights reserved. 35 | 36 | This library is disributed under an Apache 2.0 License. -------------------------------------------------------------------------------- /example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/example.png -------------------------------------------------------------------------------- /library/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/library/.DS_Store -------------------------------------------------------------------------------- /library/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /library/ShowcaseView.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /library/project.properties: -------------------------------------------------------------------------------- 1 | # This file is automatically generated by Android Tools. 2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED! 3 | # 4 | # This file must be checked in Version Control Systems. 5 | # 6 | # To customize properties used by the Ant build system edit 7 | # "ant.properties", and override values to adapt the script to your 8 | # project structure. 9 | # 10 | # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): 11 | #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 12 | 13 | android.library=true 14 | # Project target. 15 | target=android-16 16 | -------------------------------------------------------------------------------- /library/res/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/library/res/.DS_Store -------------------------------------------------------------------------------- /library/res/drawable-hdpi/btn_cling_normal.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/library/res/drawable-hdpi/btn_cling_normal.9.png -------------------------------------------------------------------------------- /library/res/drawable-hdpi/btn_cling_pressed.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/library/res/drawable-hdpi/btn_cling_pressed.9.png -------------------------------------------------------------------------------- /library/res/drawable-hdpi/cling.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/library/res/drawable-hdpi/cling.png -------------------------------------------------------------------------------- /library/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/library/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /library/res/drawable-ldpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/library/res/drawable-ldpi/ic_launcher.png -------------------------------------------------------------------------------- /library/res/drawable-mdpi/btn_cling_normal.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/library/res/drawable-mdpi/btn_cling_normal.9.png -------------------------------------------------------------------------------- /library/res/drawable-mdpi/btn_cling_pressed.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/library/res/drawable-mdpi/btn_cling_pressed.9.png -------------------------------------------------------------------------------- /library/res/drawable-mdpi/cling.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/library/res/drawable-mdpi/cling.png -------------------------------------------------------------------------------- /library/res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/library/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /library/res/drawable-xhdpi/btn_cling_normal.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/library/res/drawable-xhdpi/btn_cling_normal.9.png -------------------------------------------------------------------------------- /library/res/drawable-xhdpi/btn_cling_pressed.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/library/res/drawable-xhdpi/btn_cling_pressed.9.png -------------------------------------------------------------------------------- /library/res/drawable-xhdpi/cling.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/library/res/drawable-xhdpi/cling.png -------------------------------------------------------------------------------- /library/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/library/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /library/res/drawable/cling_button_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /library/res/layout/main.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /library/res/values/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/library/res/values/.DS_Store -------------------------------------------------------------------------------- /library/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /library/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /library/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ACTIVITY_ENTRY_NAME 4 | 5 | -------------------------------------------------------------------------------- /library/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 13 | 23 | 31 | -------------------------------------------------------------------------------- /library/src/com/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/library/src/com/.DS_Store -------------------------------------------------------------------------------- /library/src/com/espian/showcaseview/ShowcaseView.java: -------------------------------------------------------------------------------- 1 | package com.espian.showcaseview; 2 | 3 | import android.animation.Animator; 4 | import android.animation.ObjectAnimator; 5 | import android.content.Context; 6 | import android.content.SharedPreferences; 7 | import android.content.res.TypedArray; 8 | import android.graphics.*; 9 | import android.graphics.drawable.Drawable; 10 | import android.os.Build; 11 | import android.util.AttributeSet; 12 | import android.util.Log; 13 | import android.view.MotionEvent; 14 | import android.view.View; 15 | import android.widget.RelativeLayout; 16 | 17 | /** 18 | * A view which allows you to showcase areas of your app with an explanation. 19 | */ 20 | public class ShowcaseView extends RelativeLayout implements 21 | View.OnClickListener, View.OnTouchListener { 22 | 23 | public static final int TYPE_NO_LIMIT = 0; 24 | public static final int TYPE_ONE_SHOT = 1; 25 | 26 | private final String INTERNAL_PREFS = "showcase_internal"; 27 | private final String SHOT_PREF_STORE = "hasShot"; 28 | 29 | float showcaseX = -1, showcaseY = -1; 30 | int shotType = TYPE_NO_LIMIT; 31 | boolean isRedundant = false; 32 | boolean block = true; 33 | float showcaseRadius = -1; 34 | 35 | Paint background; 36 | int backColor; 37 | Drawable showcase; 38 | View mButton; 39 | OnClickListener mListener; 40 | OnShowcaseEventListener mEventListener; 41 | 42 | public ShowcaseView(Context context) { 43 | this(context, null, 0); 44 | } 45 | 46 | public ShowcaseView(Context context, AttributeSet attrs) { 47 | this(context, attrs, 0); 48 | } 49 | 50 | public ShowcaseView(Context context, AttributeSet attrs, int defStyle) { 51 | super(context, attrs, defStyle); 52 | if (attrs != null) { 53 | TypedArray styled = getContext().obtainStyledAttributes(attrs, 54 | R.styleable.ShowcaseView, defStyle, 0); 55 | int reference = Color.argb(128, 80, 80, 80); 56 | backColor = styled.getInt(R.styleable.ShowcaseView_backgroundColor, 57 | Color.argb(128, 80, 80, 80)); 58 | styled.recycle(); 59 | } 60 | } 61 | 62 | private void init() { 63 | boolean hasShot = getContext().getSharedPreferences(INTERNAL_PREFS, 64 | Context.MODE_PRIVATE).getBoolean(SHOT_PREF_STORE, false); 65 | if (hasShot && shotType == TYPE_ONE_SHOT) { 66 | // The showcase has already been shot once, so we don't need to do 67 | // anything 68 | setVisibility(View.GONE); 69 | isRedundant = true; 70 | return; 71 | } 72 | background = new Paint(); 73 | background.setColor(backColor); 74 | showcase = getContext().getResources().getDrawable(R.drawable.cling); 75 | mButton = findViewById(R.id.showcase_button); 76 | if (mButton != null) { 77 | mButton.setOnClickListener(this); 78 | } 79 | float dens = getResources().getDisplayMetrics().density; 80 | showcaseRadius = dens * 94; 81 | setOnTouchListener(this); 82 | } 83 | 84 | /** 85 | * Set the view to showcase 86 | * 87 | * @param view 88 | * The {@link View} to showcase. 89 | */ 90 | public void setShowcaseView(final View view) { 91 | if (isRedundant || view == null) { 92 | isRedundant = true; 93 | return; 94 | } 95 | isRedundant = false; 96 | 97 | view.post(new Runnable() { 98 | @Override 99 | public void run() { 100 | init(); 101 | showcaseX = (float) (view.getLeft() + view.getWidth() / 2); 102 | showcaseY = (float) (view.getTop() + view.getHeight() / 2); 103 | invalidate(); 104 | } 105 | }); 106 | } 107 | 108 | /** 109 | * Set a specific position to showcase 110 | * 111 | * @param x 112 | * @param y 113 | */ 114 | public void setShowcasePosition(float x, float y) { 115 | if (isRedundant) { 116 | return; 117 | } 118 | init(); 119 | showcaseX = x; 120 | showcaseY = y; 121 | invalidate(); 122 | } 123 | 124 | /** 125 | * Set the shot method of the showcase - only once or no limit 126 | * 127 | * @param shotType 128 | * either TYPE_ONE_SHOT or TYPE_NO_LIMIT 129 | */ 130 | public void setShotType(int shotType) { 131 | if (shotType == TYPE_NO_LIMIT || shotType == TYPE_ONE_SHOT) { 132 | this.shotType = shotType; 133 | } 134 | } 135 | 136 | /** 137 | * Decide whether touches outside the showcased circle should be ignored or 138 | * not 139 | * 140 | * @param block 141 | * true to block touches, false otherwise. By default, this is 142 | * true. 143 | */ 144 | public void blockNonShowcasedTouches(boolean block) { 145 | this.block = block; 146 | } 147 | 148 | /** 149 | * Override the standard button click event, if there is a button available 150 | * 151 | * @param listener 152 | * Listener to listen to on click events 153 | */ 154 | public void overrideButtonClick(OnClickListener listener) { 155 | if (isRedundant) { 156 | return; 157 | } 158 | if (mButton != null) { 159 | mButton.setOnClickListener(listener); 160 | } 161 | } 162 | 163 | public void setOnShowcaseEventListener(OnShowcaseEventListener listener) { 164 | mEventListener = listener; 165 | } 166 | 167 | public void removeOnShowcaseEventListener() { 168 | setOnClickListener(null); 169 | } 170 | 171 | @Override 172 | public void dispatchDraw(Canvas canvas) { 173 | if (showcaseX < 0 || showcaseY < 0 || isRedundant) { 174 | super.dispatchDraw(canvas); 175 | return; 176 | } 177 | 178 | Bitmap b = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), 179 | Bitmap.Config.ARGB_8888); 180 | Canvas c = new Canvas(b); 181 | 182 | // Draw the semi-transparent background 183 | c.drawColor(backColor); 184 | 185 | // Erase the area for the ring 186 | Paint eraser = new Paint(); 187 | eraser.setColor(0xFFFFFF); 188 | eraser.setAlpha(0); 189 | eraser.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY)); 190 | c.drawCircle(0, showcaseY, showcaseRadius, eraser); 191 | 192 | int cx = (int) showcaseX, cy = (int) showcaseY; 193 | 194 | int dw = showcase.getIntrinsicWidth(); 195 | int dh = showcase.getIntrinsicHeight(); 196 | 197 | Log.d("ShowcaseView", "dw: " + dw + " dh: " + dh); 198 | 199 | showcase.setBounds(cx - dw / 2, cy - dh / 2, cx + dw / 2, cy + dh / 2); 200 | // showcase.setBounds(-(dw), cy - dh / 2, cy - 25, cy + dh / 2); 201 | // showcase.setBounds(-(int) showcaseX, cy - dh / 2, cx + dw / 2, cy 202 | // + dh / 2); 203 | showcase.draw(c); 204 | 205 | canvas.drawBitmap(b, 0, 0, null); 206 | // c.setBitmap(null); 207 | b = null; 208 | 209 | super.dispatchDraw(canvas); 210 | 211 | } 212 | 213 | @Override 214 | public void onClick(View view) { 215 | // If the type is set to one-shot, store that it has shot 216 | if (shotType == TYPE_ONE_SHOT) { 217 | SharedPreferences internal = getContext().getSharedPreferences( 218 | "showcase_internal", Context.MODE_PRIVATE); 219 | internal.edit().putBoolean("hasShot", true).commit(); 220 | } 221 | 222 | if (mListener == null) { 223 | hide(); 224 | } else { 225 | mListener.onClick(view); 226 | } 227 | } 228 | 229 | public void hide() { 230 | if (mEventListener != null) { 231 | mEventListener.onShowcaseViewHide(this); 232 | } 233 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 234 | ObjectAnimator oa = ObjectAnimator.ofFloat(this, "alpha", 0f); 235 | oa.setDuration(300).addListener(new Animator.AnimatorListener() { 236 | @Override 237 | public void onAnimationStart(Animator animator) { 238 | } 239 | 240 | @Override 241 | public void onAnimationEnd(Animator animator) { 242 | setVisibility(View.GONE); 243 | } 244 | 245 | @Override 246 | public void onAnimationCancel(Animator animator) { 247 | } 248 | 249 | @Override 250 | public void onAnimationRepeat(Animator animator) { 251 | } 252 | }); 253 | oa.start(); 254 | } else { 255 | setVisibility(View.GONE); 256 | } 257 | } 258 | 259 | public void show() { 260 | if (mEventListener != null) { 261 | mEventListener.onShowcaseViewShow(this); 262 | } 263 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 264 | ObjectAnimator oa = ObjectAnimator.ofFloat(this, "alpha", 1f); 265 | oa.setDuration(300).addListener(new Animator.AnimatorListener() { 266 | @Override 267 | public void onAnimationStart(Animator animator) { 268 | setVisibility(View.VISIBLE); 269 | } 270 | 271 | @Override 272 | public void onAnimationEnd(Animator animator) { 273 | } 274 | 275 | @Override 276 | public void onAnimationCancel(Animator animator) { 277 | } 278 | 279 | @Override 280 | public void onAnimationRepeat(Animator animator) { 281 | } 282 | }); 283 | oa.start(); 284 | } else { 285 | setVisibility(View.VISIBLE); 286 | } 287 | } 288 | 289 | @Override 290 | public boolean onTouch(View view, MotionEvent motionEvent) { 291 | if (!block) { 292 | return false; 293 | } else { 294 | float xDelta = Math.abs(motionEvent.getRawX() - showcaseX); 295 | float yDelta = Math.abs(motionEvent.getRawY() - showcaseY); 296 | double distanceFromFocus = Math.sqrt(Math.pow(xDelta, 2) 297 | + Math.pow(yDelta, 2)); 298 | return distanceFromFocus > showcaseRadius; 299 | } 300 | } 301 | 302 | public interface OnShowcaseEventListener { 303 | 304 | public void onShowcaseViewHide(ShowcaseView showcaseView); 305 | 306 | public void onShowcaseViewShow(ShowcaseView showcaseView); 307 | 308 | } 309 | 310 | } 311 | -------------------------------------------------------------------------------- /sample/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /sample/Showcase Sample.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /sample/gen/com/espian/showcaseview/sample/BuildConfig.java: -------------------------------------------------------------------------------- 1 | /** Automatically generated file. DO NOT MODIFY */ 2 | package com.espian.showcaseview.sample; 3 | 4 | public final class BuildConfig { 5 | public final static boolean DEBUG = true; 6 | } -------------------------------------------------------------------------------- /sample/gen/com/espian/showcaseview/sample/Manifest.java: -------------------------------------------------------------------------------- 1 | package com.espian.showcaseview.sample; 2 | 3 | /* This stub is for using by IDE only. It is NOT the Manifest class actually packed into APK */ 4 | public final class Manifest { 5 | } -------------------------------------------------------------------------------- /sample/gen/com/espian/showcaseview/sample/R.java: -------------------------------------------------------------------------------- 1 | /* AUTO-GENERATED FILE. DO NOT MODIFY. 2 | * 3 | * This class was automatically generated by the 4 | * aapt tool from the resource data it found. It 5 | * should not be modified by hand. 6 | */ 7 | 8 | package com.espian.showcaseview.sample; 9 | 10 | public final class R { 11 | public static final class attr { 12 | } 13 | 14 | public static final class drawable { 15 | public static final int btn_cling_normal = 0x7f020000; 16 | public static final int btn_cling_pressed = 0x7f020001; 17 | public static final int cling = 0x7f020002; 18 | public static final int cling_button_bg = 0x7f020003; 19 | public static final int ic_launcher = 0x7f020004; 20 | } 21 | 22 | public static final class id { 23 | public static final int button = 0x7f040001; 24 | public static final int showcase = 0x7f040002; 25 | public static final int showcase_button = 0x7f040000; 26 | public static final int textView = 0x7f040003; 27 | public static final int textView1 = 0x7f040004; 28 | } 29 | 30 | public static final class layout { 31 | public static final int main = 0x7f030000; 32 | } 33 | 34 | public static final class string { 35 | public static final int app_name = 0x7f050000; 36 | } 37 | 38 | public static final class style { 39 | public static final int ClingButton = 0x7f060000; 40 | public static final int ClingText = 0x7f060002; 41 | public static final int ClingTitleText = 0x7f060001; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /sample/project.properties: -------------------------------------------------------------------------------- 1 | # This file is automatically generated by Android Tools. 2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED! 3 | # 4 | # This file must be checked in Version Control Systems. 5 | # 6 | # To customize properties used by the Ant build system edit 7 | # "ant.properties", and override values to adapt the script to your 8 | # project structure. 9 | # 10 | # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): 11 | #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 12 | 13 | # Project target. 14 | target=android-16 15 | android.library.reference.1=../library 16 | 17 | -------------------------------------------------------------------------------- /sample/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/sample/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /sample/res/drawable-ldpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/sample/res/drawable-ldpi/ic_launcher.png -------------------------------------------------------------------------------- /sample/res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/sample/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /sample/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JesusM/ShowcaseViewLibrary/417208bf336bfb5f087de38d26b4ddb660b8c8a7/sample/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /sample/res/layout/main.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 |