11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | # Features
20 | - Material Design设计风格
21 | - [Kotlin中SwipeRefreshLayout结合RecyclerView下拉刷新上拉加载](http://blog.csdn.net/donkor_/article/details/78820880)
22 | - [Kotlin实现侧滑抽屉菜单(DrawerLayout+NavigationView+Toolbar)](http://blog.csdn.net/donkor_/article/details/78819081)
23 | - [Fragment懒加载模式](http://blog.csdn.net/donkor_/article/details/78819081)
24 | - [Kotlin中handler避免内存泄漏](http://blog.csdn.net/donkor_/article/details/78796518)
25 | - [jsoup 抓取妹纸图片](https://github.com/jhy/jsoup)
26 | - [glide 图片缓存,加载缩略图,加载高清原图](https://github.com/bumptech/glide)
27 | - [DragPhotoView高仿微信可拖拽返回PhotoView](https://github.com/githubwing/DragPhotoView)
28 |
29 | # Download
30 | [火速下载](http://fir.im/DeepNight)
32 |
33 | # Platform
34 | MacBook Pro (13-inch, 2016, Four Thunderbolt 3 Ports)
35 | - macOS High Sierra(10.13.2)
36 |
37 | Android Studio
38 |
39 | - gradle 3.0.2
40 | - kotlin 1.1.51
41 |
42 | # About me
43 | ❤ 我觉得大家一起学习和交流才会更有意思,如果您觉得我的文章还不错,或是对您有过帮助,欢迎Follow、Fork、Star .咱们大家一起学习,一起交流~~❤
44 |
45 | Email :donkor@yeah.net
46 |
47 | csdn_blog: http://blog.csdn.net/donkor_
48 |
49 | jianshu_blog: http://www.jianshu.com/u/10f35b1d7e12
50 |
51 | QQ Group : 537891203
52 | 157 | * 底下是低版本"共享元素"实现 不需要过分关心 如有需要 可作为参考. 158 | *
159 | * Code under is shared transitions in all android versions implementation 160 | */ 161 | private void performExitAnimation(final DragPhotoView view, float x, float y, float w, float h) { 162 | view.finishAnimationCallBack(); 163 | float viewX = mTargetWidth / 2 + x - mTargetWidth * mScaleX / 2; 164 | float viewY = mTargetHeight / 2 + y - mTargetHeight * mScaleY / 2; 165 | view.setX(viewX); 166 | view.setY(viewY); 167 | 168 | float centerX = view.getX() + mOriginWidth / 2; 169 | float centerY = view.getY() + mOriginHeight / 2; 170 | 171 | float translateX = mOriginCenterX - centerX; 172 | float translateY = mOriginCenterY - centerY; 173 | 174 | 175 | ValueAnimator translateXAnimator = ValueAnimator.ofFloat(view.getX(), view.getX() + translateX); 176 | translateXAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 177 | @Override 178 | public void onAnimationUpdate(ValueAnimator valueAnimator) { 179 | view.setX((Float) valueAnimator.getAnimatedValue()); 180 | } 181 | }); 182 | translateXAnimator.setDuration(300); 183 | translateXAnimator.start(); 184 | ValueAnimator translateYAnimator = ValueAnimator.ofFloat(view.getY(), view.getY() + translateY); 185 | translateYAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 186 | @Override 187 | public void onAnimationUpdate(ValueAnimator valueAnimator) { 188 | view.setY((Float) valueAnimator.getAnimatedValue()); 189 | } 190 | }); 191 | translateYAnimator.addListener(new Animator.AnimatorListener() { 192 | @Override 193 | public void onAnimationStart(Animator animator) { 194 | 195 | } 196 | 197 | @Override 198 | public void onAnimationEnd(Animator animator) { 199 | animator.removeAllListeners(); 200 | finish(); 201 | overridePendingTransition(0, 0); 202 | } 203 | 204 | @Override 205 | public void onAnimationCancel(Animator animator) { 206 | 207 | } 208 | 209 | @Override 210 | public void onAnimationRepeat(Animator animator) { 211 | 212 | } 213 | }); 214 | translateYAnimator.setDuration(300); 215 | translateYAnimator.start(); 216 | } 217 | 218 | private void finishWithAnimation() { 219 | 220 | final DragPhotoView photoView = mPhotoViews[0]; 221 | ValueAnimator translateXAnimator = ValueAnimator.ofFloat(0, mTranslationX); 222 | translateXAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 223 | @Override 224 | public void onAnimationUpdate(ValueAnimator valueAnimator) { 225 | photoView.setX((Float) valueAnimator.getAnimatedValue()); 226 | } 227 | }); 228 | translateXAnimator.setDuration(300); 229 | translateXAnimator.start(); 230 | 231 | ValueAnimator translateYAnimator = ValueAnimator.ofFloat(0, mTranslationY); 232 | translateYAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 233 | @Override 234 | public void onAnimationUpdate(ValueAnimator valueAnimator) { 235 | photoView.setY((Float) valueAnimator.getAnimatedValue()); 236 | } 237 | }); 238 | translateYAnimator.setDuration(300); 239 | translateYAnimator.start(); 240 | 241 | ValueAnimator scaleYAnimator = ValueAnimator.ofFloat(1, mScaleY); 242 | scaleYAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 243 | @Override 244 | public void onAnimationUpdate(ValueAnimator valueAnimator) { 245 | photoView.setScaleY((Float) valueAnimator.getAnimatedValue()); 246 | } 247 | }); 248 | scaleYAnimator.setDuration(300); 249 | scaleYAnimator.start(); 250 | 251 | ValueAnimator scaleXAnimator = ValueAnimator.ofFloat(1, mScaleX); 252 | scaleXAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 253 | @Override 254 | public void onAnimationUpdate(ValueAnimator valueAnimator) { 255 | photoView.setScaleX((Float) valueAnimator.getAnimatedValue()); 256 | } 257 | }); 258 | 259 | scaleXAnimator.addListener(new Animator.AnimatorListener() { 260 | @Override 261 | public void onAnimationStart(Animator animator) { 262 | 263 | } 264 | 265 | @Override 266 | public void onAnimationEnd(Animator animator) { 267 | animator.removeAllListeners(); 268 | finish(); 269 | overridePendingTransition(0, 0); 270 | } 271 | 272 | @Override 273 | public void onAnimationCancel(Animator animator) { 274 | 275 | } 276 | 277 | @Override 278 | public void onAnimationRepeat(Animator animator) { 279 | 280 | } 281 | }); 282 | scaleXAnimator.setDuration(300); 283 | scaleXAnimator.start(); 284 | } 285 | 286 | private void performEnterAnimation() { 287 | final DragPhotoView photoView = mPhotoViews[0]; 288 | ValueAnimator translateXAnimator = ValueAnimator.ofFloat(photoView.getX(), 0); 289 | translateXAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 290 | @Override 291 | public void onAnimationUpdate(ValueAnimator valueAnimator) { 292 | photoView.setX((Float) valueAnimator.getAnimatedValue()); 293 | } 294 | }); 295 | translateXAnimator.setDuration(300); 296 | translateXAnimator.start(); 297 | 298 | ValueAnimator translateYAnimator = ValueAnimator.ofFloat(photoView.getY(), 0); 299 | translateYAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 300 | @Override 301 | public void onAnimationUpdate(ValueAnimator valueAnimator) { 302 | photoView.setY((Float) valueAnimator.getAnimatedValue()); 303 | } 304 | }); 305 | translateYAnimator.setDuration(300); 306 | translateYAnimator.start(); 307 | 308 | ValueAnimator scaleYAnimator = ValueAnimator.ofFloat(mScaleY, 1); 309 | scaleYAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 310 | @Override 311 | public void onAnimationUpdate(ValueAnimator valueAnimator) { 312 | photoView.setScaleY((Float) valueAnimator.getAnimatedValue()); 313 | } 314 | }); 315 | scaleYAnimator.setDuration(300); 316 | scaleYAnimator.start(); 317 | 318 | ValueAnimator scaleXAnimator = ValueAnimator.ofFloat(mScaleX, 1); 319 | scaleXAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 320 | @Override 321 | public void onAnimationUpdate(ValueAnimator valueAnimator) { 322 | photoView.setScaleX((Float) valueAnimator.getAnimatedValue()); 323 | } 324 | }); 325 | scaleXAnimator.setDuration(300); 326 | scaleXAnimator.start(); 327 | } 328 | 329 | @Override 330 | public void onBackPressed() { 331 | finishWithAnimation(); 332 | } 333 | } 334 | --------------------------------------------------------------------------------