diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index 97626ba..0000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 2665b65..3963879 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,8 +1,5 @@ - - - - - - - - - - - - - - + - - C:\Users\Administrator\AppData\Roaming\Subversion - - - - - - 1.7 - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 7bebb36..3bc2c1f 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,8 @@ - + + diff --git a/README.md b/README.md index c655901..000158f 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,64 @@ -# RecyclerView +# Coder -> MVVM开发模式中RecyclerView使用SwipRefreshLayout实现下拉刷新,自定义上拉加载更多 +项目使用MVVM模式进行开发,学习Android知识点 -## Screenshots +## Android Material Design + +> Tablayout | 横向布局标签 [介绍及使用详情](http://blog.csdn.net/lengxuechiwu1314/article/details/71079546)  + +> Coordinatorlayout | 协调布局 [介绍及使用详情](http://blog.csdn.net/lengxuechiwu1314/article/details/71090247) + +> Coordinatorlayout.Behavior | 自定义行为的协调布局 [介绍及使用详情](http://blog.csdn.net/lengxuechiwu1314/article/details/71090247) + +> CoordinatorLayout APPBarLayout CollapsingTabLayout实现折叠头布局 Special thanks [CPUdream刘玉峰](http://blog.liucoder.com) + +> TextInputLayout | 文字输入布局 [介绍及使用详情](http://blog.csdn.net/lengxuechiwu1314/article/details/71107229)  + +> FloatingActionButton | 悬浮按钮 [介绍及使用详情](http://blog.csdn.net/lengxuechiwu1314/article/details/71146380) + +> CardView | 卡片控件 [介绍及使用详情](http://blog.csdn.net/lengxuechiwu1314/article/details/71774554) + +> AppBarLayout | 嵌套布局 [介绍及使用详情](http://blog.csdn.net/lengxuechiwu1314/article/details/72472367) + +> CollapsingToolbarLayout | 折叠工具布局 [介绍及使用详情](http://blog.csdn.net/lengxuechiwu1314/article/details/72602767) + +> BottomSheetDialog | 底部对话框 [介绍及使用详情](http://blog.csdn.net/lengxuechiwu1314/article/details/72835497) + +> Touch Feedback| 触摸反馈 [介绍及使用详情](http://blog.csdn.net/lengxuechiwu1314/article/details/73166617) + +> Reveal Effect| 揭示效果 [介绍及使用详情](http://blog.csdn.net/lengxuechiwu1314/article/details/73190003) + +> Curved motion | 曲线运动 [介绍及使用详情](http://blog.csdn.net/lengxuechiwu1314/article/details/73277147) -![](https://github.com/CoderGuoy/RecyclerView/blob/master/screenshots/recyclerview.gif) +> Animated Vector Drawables | 矢量图片动画 [介绍及使用详情](http://blog.csdn.net/lengxuechiwu1314/article/details/73603990) + +## Android 基础 + +> Android 帧动画 视图动画 属性动画 [介绍及使用详情](http://blog.csdn.net/lengxuechiwu1314/article/details/71641004) + +> Android XML绘图之 Shape [介绍及使用详情](http://blog.csdn.net/lengxuechiwu1314/article/details/72934634) + +## Android 设计模式 + +> 设计模式之策略模式 | Strategy Pattern [介绍及使用详情](http://blog.csdn.net/lengxuechiwu1314/article/details/72191041) + +## Android Demo + +> RecyclerView使用SwipRefreshLayout实现下拉刷新,自定义上拉加载更多 + +> RxJava+Retrofit请求网络数据,RecyclerView加载网络图片(图片加载框架Glide) + +> RecyclerView为图片添加ObjectAnimator动画效果 + +> 继承ViewGroupon实现的 3D球 + + + +## Screenshots -### Version +![](https://github.com/CoderGuoy/AndroidNote/blob/master/screenshots/tablayout00.gif)![](https://github.com/CoderGuoy/AndroidNote/blob/master/screenshots/Coordinatorlayout00.gif)![](https://github.com/CoderGuoy/AndroidNote/blob/master/screenshots/textinputlayout.gif)![](https://github.com/CoderGuoy/AndroidNote/blob/master/screenshots/fab.gif)![](https://github.com/CoderGuoy/AndroidNote/blob/master/screenshots/bottomsheetdialog.gif)![](https://github.com/CoderGuoy/AndroidNote/blob/master/screenshots/bottomsheetdialog2.gif)![](https://github.com/CoderGuoy/AndroidNote/blob/master/screenshots/touchfeedback1.gif)![](https://github.com/CoderGuoy/AndroidNote/blob/master/screenshots/RevealEffect.gif)![](https://github.com/CoderGuoy/AndroidNote/blob/master/screenshots/curvedmotion.gif)![](https://github.com/CoderGuoy/AndroidNote/blob/master/screenshots/ball3D.gif)![](https://github.com/CoderGuoy/AndroidNote/blob/master/screenshots/customize_textview.gif)![](https://github.com/CoderGuoy/AndroidNote/blob/master/screenshots/animatedvectordrawable_smile.gif)![](https://github.com/CoderGuoy/AndroidNote/blob/master/screenshots/animatedvectordrawable_heart_bonc.gif)![](https://github.com/CoderGuoy/AndroidNote/blob/master/screenshots/vector_alpha.gif)![](https://github.com/CoderGuoy/AndroidNote/blob/master/screenshots/vector_rotation.gif)![](https://github.com/CoderGuoy/AndroidNote/blob/master/screenshots/vector_astronaut.gif) -#### V1.0.0(4-17) - - 1.RecyclerView设置滑动监听,当前可见页面滑动到底部时(newState == RecyclerView.SCROLL_STATE_IDLE), - 根据adapter返回的item类型显示foot(加载更多控件),此时去更新加载数据,如果有新数据,显示正常的item; - 如果没有新的数据,显示没有更多数据。具体见代码中的注释,比较详细 ## LICENSE - Copyright 2017 HugeTerry. - 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. + - 项目仅做学习交流,不用做商业用途,接口使用干货集中营的API diff --git a/app/build.gradle b/app/build.gradle index d629488..14be744 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,7 +5,7 @@ android { buildToolsVersion '25.0.0' defaultConfig { applicationId "com.coder.guoy.recyclerview" - minSdkVersion 19 + minSdkVersion 21 targetSdkVersion 24 versionCode 1 versionName "1.0" @@ -29,25 +29,23 @@ dependencies { androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) - testCompile 'junit:junit:4.12' - //ui + compile files('libs/glide-3.7.0.jar') + compile files('libs/glide-3.7.0-sources.jar') compile 'com.android.support:appcompat-v7:24.0.0' compile 'com.android.support:support-v4:24.0.0' + compile 'com.android.support.constraint:constraint-layout:1.0.0-beta3' compile 'com.android.support:design:24.0.0' - //rx + compile 'com.android.support:cardview-v7:24.0.0' compile 'io.reactivex:rxjava:1.1.6' compile 'io.reactivex:rxandroid:1.2.1' compile 'com.jakewharton.rxbinding:rxbinding:0.4.0' - //network compile 'com.google.code.gson:gson:2.4' compile 'com.squareup.retrofit2:retrofit:2.0.2' compile 'com.squareup.retrofit2:converter-gson:2.0.2' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2' compile 'com.squareup.okhttp3:okhttp:3.2.0' compile 'com.squareup.okhttp3:logging-interceptor:3.0.1' - //分包 compile 'com.android.support:multidex:1.0.0' - compile files('libs/glide-3.7.0.jar') - compile files('libs/glide-3.7.0-sources.jar') - + compile 'org.jsoup:jsoup:1.10.3' + testCompile 'junit:junit:4.12' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ef5234c..7d59a63 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -29,17 +29,122 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/coder/guoy/recyclerview/Constants.java b/app/src/main/java/com/coder/guoy/recyclerview/Constants.java index 3907a2f..b68b273 100644 --- a/app/src/main/java/com/coder/guoy/recyclerview/Constants.java +++ b/app/src/main/java/com/coder/guoy/recyclerview/Constants.java @@ -4,15 +4,17 @@ import java.io.File; -/** - * Created by codeest on 2016/8/3. - */ public class Constants { //================= URL ===================== //干活集中营 public static final String GANK_URL = "http://gank.io/api/"; - + //豆瓣 + public static final String DOUBAN_URL = "Https://api.douban.com/"; + //壁纸 + public static final String BZ_URl = "http://www.win4000.com/"; + //桌面壁纸 + public static final String ZMBZ = BZ_URl + "wallpaper.html"; //================= TYPE ==================== //福利 public static final String FULI = "福利"; diff --git a/app/src/main/java/com/coder/guoy/recyclerview/HomeActivity.java b/app/src/main/java/com/coder/guoy/recyclerview/HomeActivity.java new file mode 100644 index 0000000..5e70dbd --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/HomeActivity.java @@ -0,0 +1,115 @@ +package com.coder.guoy.recyclerview; + +import android.content.Intent; +import android.databinding.DataBindingUtil; +import android.os.Bundle; +import android.support.v4.view.GravityCompat; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.view.View; + +import com.coder.guoy.recyclerview.databinding.ActivityHomeBinding; +import com.coder.guoy.recyclerview.databinding.NavigationHeaderBinding; +import com.coder.guoy.recyclerview.linstener.PerfectClickListener; +import com.coder.guoy.recyclerview.ui.FreeVideoActivity; +import com.coder.guoy.recyclerview.utils.CommonUtils; +import com.coder.guoy.recyclerview.utils.ToastUtil; +import com.coder.guoy.recyclerview.view.statusbar.StatusBarUtil; + +public class HomeActivity extends AppCompatActivity implements View.OnClickListener { + + private ActivityHomeBinding bindingView; + private HomeAdapter adapter; + private LinearLayoutManager mLayoutManager; + private String[] model = {"Material Design", "RecyclerView", "CardView", "Customize", "Animation", + "Design Pattern", "Cache", "目标2", "目标3", "目标4"}; + private String[] describe = {"材料设计", "", "卡片控件", "自定义", "动画", + "设计模式", "三级缓存", "", "", ""}; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + bindingView = DataBindingUtil.setContentView(this, R.layout.activity_home); + initView(); + initRecyclerView(); + initDrawerlayout(); + } + + private void initView() { + //设置StatusBar状态栏颜色 + StatusBarUtil.setColorNoTranslucentForDrawerLayout(HomeActivity.this, bindingView.drawerlayout, + CommonUtils.getColor(R.color.colorTheme)); + findViewById(R.id.fl_title_menu).setOnClickListener(this); + + } + + /** + * 初始化RecyclerView + */ + private void initRecyclerView() { + adapter = new HomeAdapter(this, model, describe); + mLayoutManager = new LinearLayoutManager(getApplicationContext()); + bindingView.homeRecyclerview.setLayoutManager(mLayoutManager); + bindingView.homeRecyclerview.setAdapter(adapter); + } + + /** + * 初始化侧拉菜单 + */ + private void initDrawerlayout() { + View headerView = bindingView.navigationview.getHeaderView(0); + NavigationHeaderBinding bind = DataBindingUtil.bind(headerView); + bind.llNavVideo.setOnClickListener(listener); + bind.llNav2.setOnClickListener(listener); + bind.llNav3.setOnClickListener(listener); + bind.llNav4.setOnClickListener(listener); + bind.llNav5.setOnClickListener(listener); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.fl_title_menu:// 开启菜单 + bindingView.drawerlayout.openDrawer(GravityCompat.START); + break; + } + } + + private PerfectClickListener listener = new PerfectClickListener() { + @Override + protected void onNoDoubleClick(final View v) { + bindingView.drawerlayout.closeDrawer(GravityCompat.START); + bindingView.drawerlayout.postDelayed(new Runnable() { + @Override + public void run() { + switch (v.getId()) { + case R.id.ll_nav_video: + startActivity(new Intent(HomeActivity.this, FreeVideoActivity.class)); + break; + case R.id.ll_nav_2: + ToastUtil.show("敬请期待"); + break; + case R.id.ll_nav_3: + ToastUtil.show("敬请期待"); + break; + case R.id.ll_nav_4: + ToastUtil.show("敬请期待"); + break; + case R.id.ll_nav_5: + ToastUtil.show("敬请期待"); + break; + } + } + }, 260); + } + }; + + @Override + public void onBackPressed() { + if (bindingView.drawerlayout.isDrawerOpen(GravityCompat.START)) { + bindingView.drawerlayout.closeDrawer(GravityCompat.START); + } else { + super.onBackPressed(); + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/HomeAdapter.java b/app/src/main/java/com/coder/guoy/recyclerview/HomeAdapter.java new file mode 100644 index 0000000..a3cef82 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/HomeAdapter.java @@ -0,0 +1,135 @@ +package com.coder.guoy.recyclerview; + +import android.content.Context; +import android.content.Intent; +import android.databinding.DataBindingUtil; +import android.support.v7.widget.CardView; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.coder.guoy.recyclerview.databinding.ItemHomeBannerBinding; +import com.coder.guoy.recyclerview.databinding.ItemHomeBinding; +import com.coder.guoy.recyclerview.ui.PlayCardView; +import com.coder.guoy.recyclerview.ui.cache.CacheActivity; +import com.coder.guoy.recyclerview.ui.holder.AnimationHolder; +import com.coder.guoy.recyclerview.ui.holder.CustomizeHolder; +import com.coder.guoy.recyclerview.ui.holder.DesignPatternHolder; +import com.coder.guoy.recyclerview.ui.holder.MaterialDesignHolder; +import com.coder.guoy.recyclerview.ui.holder.RecyclerViewHolder; + +/** + * @Version: + * @Author: + * @CreateTime:2017年5月11日 + * @Descrpiton: + */ +public class HomeAdapter extends RecyclerView.Adapter { + private String[] model; + private String[] describe; + private LayoutInflater mInflater; + private Context mContext; + private ItemHomeBinding normalBindingView; + private ItemHomeBannerBinding bannerBindView; + private int bannerType = 0; // 第一种ViewType,头部banner + private int normalType = 1; // 第二种ViewType,正常的item + + public HomeAdapter(Context context, String[] model, String[] describe) { + mInflater = LayoutInflater.from(context); + this.model = model; + this.describe = describe; + mContext = context; + } + + @Override + public int getItemViewType(int position) { + if ((position == 0)) { + return bannerType; + } else { + return normalType; + } + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + if (viewType == bannerType) { + bannerBindView = DataBindingUtil.inflate(mInflater, R.layout.item_home_banner, parent, false); + return new BannerViewHolder(bannerBindView.getRoot()); + } else { + normalBindingView = DataBindingUtil.inflate(mInflater, R.layout.item_home, parent, false); + return new NormalViewHolder(normalBindingView.getRoot()); + } + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { + if (holder instanceof BannerViewHolder) {//展示banner + BannerViewHolder bvh = (BannerViewHolder) holder; + bvh.imageBanner.setImageResource(R.drawable.image_banner); + } else { + final NormalViewHolder vh = (NormalViewHolder) holder; + vh.title.setText(model[position - 1]); + vh.describe.setText(describe[position - 1]); + normalBindingView.getRoot().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + switch (position) { + case 1://Material Design + mContext.startActivity(new Intent(mContext, MaterialDesignHolder.class)); + break; + case 2://RecyclerView + mContext.startActivity(new Intent(mContext, RecyclerViewHolder.class)); + break; + case 3://CardView http://www.tuicool.com/articles/zyIbyyj + mContext.startActivity(new Intent(mContext, PlayCardView.class)); + break; + case 4://Customize + mContext.startActivity(new Intent(mContext, CustomizeHolder.class)); + break; + case 5://Animation + mContext.startActivity(new Intent(mContext, AnimationHolder.class)); + break; + case 6://Design Pattern + mContext.startActivity(new Intent(mContext, DesignPatternHolder.class)); + break; + case 7:// + mContext.startActivity(new Intent(mContext, CacheActivity.class)); + break; + } + } + }); + } + } + + @Override + public int getItemCount() { + return model.length; + } + + private class NormalViewHolder extends RecyclerView.ViewHolder { + public CardView cardView; + public TextView title; + public TextView describe; + + public NormalViewHolder(View itemView) { + super(itemView); + cardView = normalBindingView.homeCardview; + title = normalBindingView.homeText; + describe = normalBindingView.textDescribe; + } + } + + private class BannerViewHolder extends RecyclerView.ViewHolder { + public CardView banner; + public ImageView imageBanner; + + public BannerViewHolder(View itemView) { + super(itemView); + banner = bannerBindView.viewBanner; + imageBanner = bannerBindView.imageBanner; + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/api/bean/ImageBean.java b/app/src/main/java/com/coder/guoy/recyclerview/api/bean/ImageBean.java new file mode 100644 index 0000000..8067190 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/api/bean/ImageBean.java @@ -0,0 +1,87 @@ +package com.coder.guoy.recyclerview.api.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * @Version: + * @Author:Guoy + * @CreateTime:2017/10/9 + * @Descrpiton:美眉 + */ +public class ImageBean implements Parcelable { + private String linkUrl; + private String imageUrl; + private String thumbnailImageUrl; + private String imgaeTitle; + + public ImageBean(String linkUrl, String imageUrl, String imgaeTitle) { + this.linkUrl = linkUrl; + this.imageUrl = imageUrl; + this.imgaeTitle = imgaeTitle; + } + + protected ImageBean(Parcel in) { + linkUrl = in.readString(); + imageUrl = in.readString(); + imgaeTitle = in.readString(); + thumbnailImageUrl = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public ImageBean createFromParcel(Parcel in) { + return new ImageBean(in); + } + + @Override + public ImageBean[] newArray(int size) { + return new ImageBean[size]; + } + }; + + public String getLinkUrl() { + return linkUrl; + } + + public void setLinkUrl(String linkUrl) { + this.linkUrl = linkUrl; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public String getImgaeTitle() { + return imgaeTitle; + } + + public void setImgaeTitle(String imgaeTitle) { + this.imgaeTitle = imgaeTitle; + } + + public String getThumbnailImageUrl() { + return thumbnailImageUrl; + } + + public void setThumbnailImageUrl(String thumbnailImageUrl) { + this.thumbnailImageUrl = thumbnailImageUrl; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(linkUrl); + dest.writeString(imageUrl); + dest.writeString(imgaeTitle); + dest.writeString(thumbnailImageUrl); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/api/bean/ZhouYuBean.java b/app/src/main/java/com/coder/guoy/recyclerview/api/bean/ZhouYuBean.java new file mode 100644 index 0000000..7d0c649 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/api/bean/ZhouYuBean.java @@ -0,0 +1,332 @@ +package com.coder.guoy.recyclerview.api.bean; + +import java.util.List; + +/** + * @Version: + * @Author:Guoy + * @CreateTime:2017/8/10 + * @Descrpiton: + */ +public class ZhouYuBean { + + /** + * code : 0 + * msg : 5 + * obj : [{"cSRQ":"1968-11-07","cZZZ":"广东省东莞市东城区东城中路南123号3栋401号","fWCS":"主山社区","gJ":"中国","gMSFZBH":"442527196811070888","hH":"087017034","hKDZ":"广东省东莞市东城区东城中路南123号3栋401号","iD":"1","lXFS":"22471396","mZ":"汉族","nL":"47","qHBM":"441901003016","qHMC":"主山社区","sFLDRK":"0","sSJD":"东城街道","sSSQ":"主山社区","sSXQ":"主山社区","xB":"女","xM":"邓桂芳","yHZGX":"02","zJLX":"身份证"},{"bSXQTZZ":"广东省东莞市东城区","cSRQ":"1980-08-17","cZZZ":"广东省东莞市东城区主山新三杞1巷19号","gJ":"中国","gMSFZBH":"422130198008174321","hKDZ":"湖北省黄冈市黄梅县","hYZK":"90","iD":"141488","mZ":"汉族","nL":"35","qHBM":"441901003016","qHMC":"主山社区","sFLDRK":"1","sG":"0","sSJD":"东城街道","sSSQ":"公安分局","wHCD":"其他","xB":"女","xM":"邓桂芳","zJLX":"身份证"},{"bSXQTZZ":"广东省东莞市东城区","cSRQ":"1981-11-06","cZZZ":"广东省东莞市东城区星城居委会花园城听竹轩6幢1座502号","gJ":"中国","gMSFZBH":"440981198111061443","hKDZ":"广东省茂名市高州市","hYZK":"20","iD":"327383","lXFS":"13827231969","mZ":"汉族","nL":"34","qHBM":"441901003023","qHMC":"星城社区","sFLDRK":"1","sG":"156","sJHM":"13827231969","sSJD":"东城街道","sSSQ":"公安分局","wHCD":"大学专科教育","xB":"女","xM":"邓桂芳","zJLX":"身份证","zZMM":"13"},{"bSXQTZZ":"广东省东莞市东城区","cSRQ":"1977-05-21","cZZZ":"广东省东莞市东城区牛山上山门中心路4号湖豪灯饰厂宿舍","gJ":"中国","gMSFZBH":"511022197705213446","hKDZ":"广东省东莞市虎门港","hYZK":"90","iD":"512207","mZ":"汉族","nL":"38","qHBM":"441901003020","qHMC":"牛山社区","sFLDRK":"1","sG":"0","sSJD":"东城街道","sSSQ":"公安分局","wHCD":"其他","xB":"女","xM":"邓桂芳","zJLX":"身份证"},{"cSRQ":"1980-08-17","cZZZ":"新三杞1巷19号","fWCS":"主山","gJ":"中国","gMSFZBH":"422130800817432","hKDZ":"湖北省黄梅县张河乡卢列村十一组","hYZK":"20","iD":"828821","mZ":"汉族","nL":"35","qHBM":"441901003016","qHMC":"主山社区","sFLDRK":"1","sSJD":"东城街道","sSSQ":"新莞人","sSXQ":"主山","wHCD":"初级中学教育","xB":"女","xM":"邓桂芳","zJLX":"身份证","zWZC":"工人","zZMM":"13"}] + */ + + private String code; + private String msg; + private List obj; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public List getObj() { + return obj; + } + + public void setObj(List obj) { + this.obj = obj; + } + + public static class ObjBean { + /** + * cSRQ : 1968-11-07 + * cZZZ : 广东省东莞市东城区东城中路南123号3栋401号 + * fWCS : 主山社区 + * gJ : 中国 + * gMSFZBH : 442527196811070888 + * hH : 087017034 + * hKDZ : 广东省东莞市东城区东城中路南123号3栋401号 + * iD : 1 + * lXFS : 22471396 + * mZ : 汉族 + * nL : 47 + * qHBM : 441901003016 + * qHMC : 主山社区 + * sFLDRK : 0 + * sSJD : 东城街道 + * sSSQ : 主山社区 + * sSXQ : 主山社区 + * xB : 女 + * xM : 邓桂芳 + * yHZGX : 02 + * zJLX : 身份证 + * bSXQTZZ : 广东省东莞市东城区 + * hYZK : 90 + * sG : 0 + * wHCD : 其他 + * sJHM : 13827231969 + * zZMM : 13 + * zWZC : 工人 + */ + + private String cSRQ; + private String cZZZ; + private String fWCS; + private String gJ; + private String gMSFZBH; + private String hH; + private String hKDZ; + private String iD; + private String lXFS; + private String mZ; + private String nL; + private String qHBM; + private String qHMC; + private String sFLDRK; + private String sSJD; + private String sSSQ; + private String sSXQ; + private String xB; + private String xM; + private String yHZGX; + private String zJLX; + private String bSXQTZZ; + private String hYZK; + private String sG; + private String wHCD; + private String sJHM; + private String zZMM; + private String zWZC; + + public String getCSRQ() { + return cSRQ; + } + + public void setCSRQ(String cSRQ) { + this.cSRQ = cSRQ; + } + + public String getCZZZ() { + return cZZZ; + } + + public void setCZZZ(String cZZZ) { + this.cZZZ = cZZZ; + } + + public String getFWCS() { + return fWCS; + } + + public void setFWCS(String fWCS) { + this.fWCS = fWCS; + } + + public String getGJ() { + return gJ; + } + + public void setGJ(String gJ) { + this.gJ = gJ; + } + + public String getGMSFZBH() { + return gMSFZBH; + } + + public void setGMSFZBH(String gMSFZBH) { + this.gMSFZBH = gMSFZBH; + } + + public String getHH() { + return hH; + } + + public void setHH(String hH) { + this.hH = hH; + } + + public String getHKDZ() { + return hKDZ; + } + + public void setHKDZ(String hKDZ) { + this.hKDZ = hKDZ; + } + + public String getID() { + return iD; + } + + public void setID(String iD) { + this.iD = iD; + } + + public String getLXFS() { + return lXFS; + } + + public void setLXFS(String lXFS) { + this.lXFS = lXFS; + } + + public String getMZ() { + return mZ; + } + + public void setMZ(String mZ) { + this.mZ = mZ; + } + + public String getNL() { + return nL; + } + + public void setNL(String nL) { + this.nL = nL; + } + + public String getQHBM() { + return qHBM; + } + + public void setQHBM(String qHBM) { + this.qHBM = qHBM; + } + + public String getQHMC() { + return qHMC; + } + + public void setQHMC(String qHMC) { + this.qHMC = qHMC; + } + + public String getSFLDRK() { + return sFLDRK; + } + + public void setSFLDRK(String sFLDRK) { + this.sFLDRK = sFLDRK; + } + + public String getSSJD() { + return sSJD; + } + + public void setSSJD(String sSJD) { + this.sSJD = sSJD; + } + + public String getSSSQ() { + return sSSQ; + } + + public void setSSSQ(String sSSQ) { + this.sSSQ = sSSQ; + } + + public String getSSXQ() { + return sSXQ; + } + + public void setSSXQ(String sSXQ) { + this.sSXQ = sSXQ; + } + + public String getXB() { + return xB; + } + + public void setXB(String xB) { + this.xB = xB; + } + + public String getXM() { + return xM; + } + + public void setXM(String xM) { + this.xM = xM; + } + + public String getYHZGX() { + return yHZGX; + } + + public void setYHZGX(String yHZGX) { + this.yHZGX = yHZGX; + } + + public String getZJLX() { + return zJLX; + } + + public void setZJLX(String zJLX) { + this.zJLX = zJLX; + } + + public String getBSXQTZZ() { + return bSXQTZZ; + } + + public void setBSXQTZZ(String bSXQTZZ) { + this.bSXQTZZ = bSXQTZZ; + } + + public String getHYZK() { + return hYZK; + } + + public void setHYZK(String hYZK) { + this.hYZK = hYZK; + } + + public String getSG() { + return sG; + } + + public void setSG(String sG) { + this.sG = sG; + } + + public String getWHCD() { + return wHCD; + } + + public void setWHCD(String wHCD) { + this.wHCD = wHCD; + } + + public String getSJHM() { + return sJHM; + } + + public void setSJHM(String sJHM) { + this.sJHM = sJHM; + } + + public String getZZMM() { + return zZMM; + } + + public void setZZMM(String zZMM) { + this.zZMM = zZMM; + } + + public String getZWZC() { + return zWZC; + } + + public void setZWZC(String zWZC) { + this.zWZC = zWZC; + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/base/MvvmBaseActivity.java b/app/src/main/java/com/coder/guoy/recyclerview/base/MvvmBaseActivity.java index 74f6104..0cbf0dd 100644 --- a/app/src/main/java/com/coder/guoy/recyclerview/base/MvvmBaseActivity.java +++ b/app/src/main/java/com/coder/guoy/recyclerview/base/MvvmBaseActivity.java @@ -17,11 +17,6 @@ import com.coder.guoy.recyclerview.R; import com.coder.guoy.recyclerview.databinding.ActivityBaseMvvmBinding; import com.coder.guoy.recyclerview.linstener.PerfectClickListener; -import com.coder.guoy.recyclerview.utils.CommonUtils; -import com.coder.guoy.recyclerview.utils.StatusBarUtils; - -import rx.Subscription; -import rx.subscriptions.CompositeSubscription; /** * @Version:1.0 @@ -39,7 +34,6 @@ public class MvvmBaseActivity extends AppCompatActiv private View refresh;//加载失败 private ActivityBaseMvvmBinding mBaseBinding; private AnimationDrawable mAnimationDrawable; - private CompositeSubscription mCompositeSubscription; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -56,10 +50,7 @@ public void setContentView(@LayoutRes int layoutResID) { RelativeLayout mContainer = (RelativeLayout) mBaseBinding.getRoot().findViewById(R.id.container); mContainer.addView(bindingView.getRoot()); getWindow().setContentView(mBaseBinding.getRoot()); - overridePendingTransition(R.anim.slide_left_in,R.anim.slide_left_out); - // 设置透明状态栏 - StatusBarUtils.setColor(this, CommonUtils.getColor(R.color.colorTheme), 0); llProgressBar = getView(R.id.ll_progress_bar); refresh = getView(R.id.ll_error_refresh); ImageView img = getView(R.id.img_progress); @@ -70,6 +61,7 @@ public void setContentView(@LayoutRes int layoutResID) { if (!mAnimationDrawable.isRunning()) { mAnimationDrawable.start(); } + setToolBar(); // 点击加载失败布局 refresh.setOnClickListener(new PerfectClickListener() { @Override @@ -80,11 +72,39 @@ protected void onNoDoubleClick(View v) { }); bindingView.getRoot().setVisibility(View.GONE); } + + /** + * 设置ToolBar的返回 + */ + private void setToolBar() { + mBaseBinding.toolbarBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + /** + * 设置标题 + * @param title + */ + public void setTitle(String title) { + mBaseBinding.textviewTitle.setText(title); + } + + /** + * 设置整个ToolBar是否显示 + * @param visible + */ + public void setToolbarVisible(int visible){ + mBaseBinding.toolbar.setVisibility(visible); + } + protected T getView(int id) { return (T) findViewById(id); } - /** * 失败后点击刷新 */ @@ -143,36 +163,9 @@ protected void showError() { } } - public void addSubscription(Subscription s) { - if (this.mCompositeSubscription == null) { - this.mCompositeSubscription = new CompositeSubscription(); - } - this.mCompositeSubscription.add(s); - } - - @Override - public void onDestroy() { - super.onDestroy(); - if (this.mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) { - this.mCompositeSubscription.unsubscribe(); - } - } - - public void removeSubscription() { - if (this.mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) { - this.mCompositeSubscription.unsubscribe(); - } - } - - @Override - public void finish() { - super.finish(); - overridePendingTransition(R.anim.slide_right_in,R.anim.slide_right_out); - } - - /** * 添加fragment + * * @param addId * @param fragment */ @@ -183,6 +176,7 @@ protected void addFragment(int addId, MvvmBaseFragment fragment) { protected void replaceFragment(int addId, MvvmBaseFragment fragment) { getSupportFragmentManager().beginTransaction().replace(addId, fragment).commit(); } + protected void removeFragment(MvvmBaseFragment fragment) { getSupportFragmentManager().beginTransaction().remove(fragment).commit(); } diff --git a/app/src/main/java/com/coder/guoy/recyclerview/base/MvvmBaseHeadActivity.java b/app/src/main/java/com/coder/guoy/recyclerview/base/MvvmBaseHeadActivity.java deleted file mode 100644 index 34cf44e..0000000 --- a/app/src/main/java/com/coder/guoy/recyclerview/base/MvvmBaseHeadActivity.java +++ /dev/null @@ -1,241 +0,0 @@ -package com.coder.guoy.recyclerview.base; - -import android.databinding.DataBindingUtil; -import android.databinding.ViewDataBinding; -import android.graphics.drawable.AnimationDrawable; -import android.os.Bundle; -import android.support.annotation.LayoutRes; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; -import android.util.Log; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.RelativeLayout; - -import com.coder.guoy.recyclerview.R; -import com.coder.guoy.recyclerview.databinding.ActivityBaseheadMvvmBinding; -import com.coder.guoy.recyclerview.linstener.PerfectClickListener; -import com.coder.guoy.recyclerview.utils.CommonUtils; -import com.coder.guoy.recyclerview.utils.StatusBarUtils; - -import rx.Subscription; -import rx.subscriptions.CompositeSubscription; - -/** - * @Version:1.0 - * @Author:Guoy - * @CreateTime:2017年4月7日 - * @Descrpiton:MVVM模式的BaseActivity - * @UpDateAuthor: - * @UpDateTime: - * @UpDataWhat: - */ - -public class MvvmBaseHeadActivity extends AppCompatActivity { - protected SV bindingView;// 布局view - private LinearLayout llProgressBar;//努力加载中... - private View refresh;//加载失败 - private ActivityBaseheadMvvmBinding mBaseBinding; - private AnimationDrawable mAnimationDrawable; - private CompositeSubscription mCompositeSubscription; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - Log.i("baseactivity", "baseactivity" +getClass().getSimpleName()); - } - - @Override - public void setContentView(@LayoutRes int layoutResID) { - mBaseBinding = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.activity_basehead_mvvm, null, false); - bindingView = DataBindingUtil.inflate(getLayoutInflater(), layoutResID, null, false); - //content - RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); - bindingView.getRoot().setLayoutParams(params); - RelativeLayout mContainer = (RelativeLayout) mBaseBinding.getRoot().findViewById(R.id.container); - mContainer.addView(bindingView.getRoot()); - getWindow().setContentView(mBaseBinding.getRoot()); - - overridePendingTransition(R.anim.slide_left_in,R.anim.slide_left_out); - - // 设置透明状态栏 - StatusBarUtils.setColor(this, CommonUtils.getColor(R.color.colorTheme), 0); - llProgressBar = getView(R.id.ll_progress_bar); - refresh = getView(R.id.ll_error_refresh); - ImageView img = getView(R.id.img_progress); - - // 加载动画 - mAnimationDrawable = (AnimationDrawable) img.getDrawable(); - // 默认进入页面就开启动画 - if (!mAnimationDrawable.isRunning()) { - mAnimationDrawable.start(); - } - setTitleBar(); - // 点击加载失败布局 - refresh.setOnClickListener(new PerfectClickListener() { - @Override - protected void onNoDoubleClick(View v) { - showLoading(); - onRefresh(); - } - }); - - bindingView.getRoot().setVisibility(View.GONE); - } - protected T getView(int id) { - return (T) findViewById(id); - } - - /** - * 设置titlebar - */ - protected void setTitleBar() { - mBaseBinding.back.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - backFragment(); - } - }); - - } - - /** - * 返回键和左上角的返回图标返回效果一致 - * - * @param keyCode - * @param event - * @return - */ - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { - backFragment(); - return true; - } - return super.onKeyDown(keyCode, event); - } - - public void setTitle(CharSequence text) { - mBaseBinding.textviewTitle.setText(text); - } - - /** - * fragment返回 - */ - public void backFragment() { - if (getSupportFragmentManager().getBackStackEntryCount() <= 1) {//这里是取出我们返回栈存在Fragment的个数 - finish(); - } else { - getSupportFragmentManager().popBackStack(); - } - } - - /** - * 带动画的返回 - */ - @Override - public void finish() { - super.finish(); - overridePendingTransition(R.anim.slide_right_in,R.anim.slide_right_out); - } - - /** - * 失败后点击刷新 - */ - protected void onRefresh() { - - } - - /** - * 显示进度条 - */ - protected void showLoading() { - if (llProgressBar.getVisibility() != View.VISIBLE) { - llProgressBar.setVisibility(View.VISIBLE); - } - // 开始动画 - if (!mAnimationDrawable.isRunning()) { - mAnimationDrawable.start(); - } - if (bindingView.getRoot().getVisibility() != View.GONE) { - bindingView.getRoot().setVisibility(View.GONE); - } - if (refresh.getVisibility() != View.GONE) { - refresh.setVisibility(View.GONE); - } - } - - protected void showContentView() { - if (llProgressBar.getVisibility() != View.GONE) { - llProgressBar.setVisibility(View.GONE); - } - // 停止动画 - if (mAnimationDrawable.isRunning()) { - mAnimationDrawable.stop(); - } - if (refresh.getVisibility() != View.GONE) { - refresh.setVisibility(View.GONE); - } - if (bindingView.getRoot().getVisibility() != View.VISIBLE) { - bindingView.getRoot().setVisibility(View.VISIBLE); - } - } - - protected void showError() { - if (llProgressBar.getVisibility() != View.GONE) { - llProgressBar.setVisibility(View.GONE); - } - // 停止动画 - if (mAnimationDrawable.isRunning()) { - mAnimationDrawable.stop(); - } - if (refresh.getVisibility() != View.VISIBLE) { - refresh.setVisibility(View.VISIBLE); - } - if (bindingView.getRoot().getVisibility() != View.GONE) { - bindingView.getRoot().setVisibility(View.GONE); - } - } - - public void addSubscription(Subscription s) { - if (this.mCompositeSubscription == null) { - this.mCompositeSubscription = new CompositeSubscription(); - } - this.mCompositeSubscription.add(s); - } - - @Override - public void onDestroy() { - super.onDestroy(); - if (this.mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) { - this.mCompositeSubscription.unsubscribe(); - } - } - - public void removeSubscription() { - if (this.mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) { - this.mCompositeSubscription.unsubscribe(); - } - } - - /** - * 添加fragment - * @param addId - * @param fragment - */ - protected void addFragment(int addId, MvvmBaseFragment fragment) { - getSupportFragmentManager().beginTransaction() - .add(addId, fragment).addToBackStack(null).commit(); - } - - protected void replaceFragment(int addId, MvvmBaseFragment fragment) { - getSupportFragmentManager().beginTransaction().replace(addId, fragment).commit(); - } - protected void removeFragment(MvvmBaseFragment fragment) { - getSupportFragmentManager().beginTransaction().remove(fragment).commit(); - } -} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/base/MvvmBaseHeadFragment.java b/app/src/main/java/com/coder/guoy/recyclerview/base/MvvmBaseHeadFragment.java deleted file mode 100644 index 3ebabe4..0000000 --- a/app/src/main/java/com/coder/guoy/recyclerview/base/MvvmBaseHeadFragment.java +++ /dev/null @@ -1,236 +0,0 @@ -package com.coder.guoy.recyclerview.base; - -import android.databinding.DataBindingUtil; -import android.databinding.ViewDataBinding; -import android.graphics.drawable.AnimationDrawable; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import com.coder.guoy.recyclerview.R; -import com.coder.guoy.recyclerview.linstener.PerfectClickListener; - -import rx.Subscription; -import rx.subscriptions.CompositeSubscription; - -/** - * @Version:1.0 - * @Author:Guoy - * @CreateTime:2017年4月7日 - * @Descrpiton:MVVM模式的BaseFragment - * @UpDateAuthor: - * @UpDateTime: - * @UpDataWhat: - */ -public abstract class MvvmBaseHeadFragment extends Fragment { - - // 布局view - protected SV bindingView; - // fragment是否显示了 - protected boolean mIsVisible = false; - // 加载中 - private LinearLayout mLlProgressBar; - // 加载失败 - private LinearLayout mRefresh; - //返回 - private ImageView back; - //标题 - private TextView textviewTitle; - // 内容布局 - protected RelativeLayout mContainer; - // 动画 - private AnimationDrawable mAnimationDrawable; - private CompositeSubscription mCompositeSubscription; - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View ll = inflater.inflate(R.layout.activity_basehead_mvvm, null); - bindingView = DataBindingUtil.inflate(getActivity().getLayoutInflater(), setContent(), null, false); - RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); - bindingView.getRoot().setLayoutParams(params); - mContainer = (RelativeLayout) ll.findViewById(R.id.container); - mContainer.addView(bindingView.getRoot()); - return ll; - } - - /** - * 在这里实现Fragment数据的缓加载. - */ - @Override - public void setUserVisibleHint(boolean isVisibleToUser) { - super.setUserVisibleHint(isVisibleToUser); - if (getUserVisibleHint()) { - mIsVisible = true; - onVisible(); - } else { - mIsVisible = false; - onInvisible(); - } - } - - protected void onInvisible() { - } - - /** - * 显示时加载数据,需要这样的使用 - * 注意声明 isPrepared,先初始化 - * 生命周期会先执行 setUserVisibleHint 再执行onActivityCreated - * 在 onActivityCreated 之后第一次显示加载数据,只加载一次 - */ - protected void loadData() { - } - - protected void onVisible() { - loadData(); - } - - @Override - public void onActivityCreated(@Nullable Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - mLlProgressBar = getView(R.id.ll_progress_bar); - ImageView img = getView(R.id.img_progress); - back = getView(R.id.back); - - //加载动画 - mAnimationDrawable = (AnimationDrawable) img.getDrawable(); - // 默认进入页面就开启动画 - if (!mAnimationDrawable.isRunning()) { - mAnimationDrawable.start(); - } - mRefresh = getView(R.id.ll_error_refresh); - // 点击加载失败布局 - mRefresh.setOnClickListener(new PerfectClickListener() { - @Override - protected void onNoDoubleClick(View v) { - showLoading(); - onRefresh(); - } - }); - bindingView.getRoot().setVisibility(View.GONE); - } - - - protected void hidiBack(){ - back.setVisibility(View.GONE); - } - - - protected T getView(int id) { - return (T) getView().findViewById(id); - } - - /** - * 布局 - */ - public abstract int setContent(); - - /** - * 加载失败后点击后的操作 - */ - protected void onRefresh() { - - } - - /** - * 显示加载中状态 - */ - protected void showLoading() { - if (mLlProgressBar.getVisibility() != View.VISIBLE) { - mLlProgressBar.setVisibility(View.VISIBLE); - } - // 开始动画 - if (!mAnimationDrawable.isRunning()) { - mAnimationDrawable.start(); - } - if (bindingView.getRoot().getVisibility() != View.GONE) { - bindingView.getRoot().setVisibility(View.GONE); - } - if (mRefresh.getVisibility() != View.GONE) { - mRefresh.setVisibility(View.GONE); - } - } - - /** - * 加载完成的状态 - */ - protected void showContentView() { - if (mLlProgressBar.getVisibility() != View.GONE) { - mLlProgressBar.setVisibility(View.GONE); - } - // 停止动画 - if (mAnimationDrawable.isRunning()) { - mAnimationDrawable.stop(); - } - if (mRefresh.getVisibility() != View.GONE) { - mRefresh.setVisibility(View.GONE); - } - if (bindingView.getRoot().getVisibility() != View.VISIBLE) { - bindingView.getRoot().setVisibility(View.VISIBLE); - } - } - - /** - * 设置titlebar - */ - protected void setTitleBar() { - back.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - onDestroy(); - } - }); - } - - public void setTitle(CharSequence text) { - textviewTitle.setText(text); - } - - - /** - * 加载失败点击重新加载的状态 - */ - protected void showError() { - if (mLlProgressBar.getVisibility() != View.GONE) { - mLlProgressBar.setVisibility(View.GONE); - } - // 停止动画 - if (mAnimationDrawable.isRunning()) { - mAnimationDrawable.stop(); - } - if (mRefresh.getVisibility() != View.VISIBLE) { - mRefresh.setVisibility(View.VISIBLE); - } - if (bindingView.getRoot().getVisibility() != View.GONE) { - bindingView.getRoot().setVisibility(View.GONE); - } - } - - public void addSubscription(Subscription s) { - if (this.mCompositeSubscription == null) { - this.mCompositeSubscription = new CompositeSubscription(); - } - this.mCompositeSubscription.add(s); - } - - @Override - public void onDestroy() { - super.onDestroy(); - if (this.mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) { - this.mCompositeSubscription.unsubscribe(); - } - } - - public void removeSubscription() { - if (this.mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) { - this.mCompositeSubscription.unsubscribe(); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/coder/guoy/recyclerview/designpattern/StrategyDesign.java b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/StrategyDesign.java new file mode 100644 index 0000000..1fd25b1 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/StrategyDesign.java @@ -0,0 +1,29 @@ +package com.coder.guoy.recyclerview.designpattern; + +import android.os.Bundle; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityStrategyDesignBinding; +import com.coder.guoy.recyclerview.designpattern.strategy.Duck; +import com.coder.guoy.recyclerview.designpattern.strategy.FlyRocketPowered; +import com.coder.guoy.recyclerview.designpattern.strategy.MallardDuck; +import com.coder.guoy.recyclerview.designpattern.strategy.ModelDuck; + +public class StrategyDesign extends MvvmBaseActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_strategy_design); + showContentView(); + Duck duck = new MallardDuck(); + duck.performQuack(); + duck.performFly(); + + Duck modle = new ModelDuck(); + modle.performFly(); + modle.setFlyBehavior(new FlyRocketPowered()); + modle.performFly(); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/Duck.java b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/Duck.java new file mode 100644 index 0000000..17c732a --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/Duck.java @@ -0,0 +1,38 @@ +package com.coder.guoy.recyclerview.designpattern.strategy; + +/** + * @Version: + * @Author: + * @CreateTime: + * @Descrpiton: + */ +public abstract class Duck { + FlyBehavior mFlyBehavior; + QuackBehavior mQuackBehavior; + + public Duck(){ + + } + + public abstract void display(); + + public void performFly(){ + mFlyBehavior.fly(); + } + + public void performQuack(){ + mQuackBehavior.quack(); + } + + public void setFlyBehavior(FlyBehavior fb) { + mFlyBehavior = fb; + } + + public void setQuackBehavior(QuackBehavior qb) { + mQuackBehavior = qb; + } + + public void swim(){ + System.out.print("所有鸭子都会游泳"); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/FlyBehavior.java b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/FlyBehavior.java new file mode 100644 index 0000000..f3198dc --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/FlyBehavior.java @@ -0,0 +1,11 @@ +package com.coder.guoy.recyclerview.designpattern.strategy; + +/** + * @Version: + * @Author: + * @CreateTime:2017年5月15日 + * @Descrpiton:所有飞行行为类必须实现的接口 + */ +public interface FlyBehavior { + public void fly(); +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/FlyNoWay.java b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/FlyNoWay.java new file mode 100644 index 0000000..2ede7bb --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/FlyNoWay.java @@ -0,0 +1,14 @@ +package com.coder.guoy.recyclerview.designpattern.strategy; + +/** + * @Version: + * @Author: + * @CreateTime:2017年5月15日 + * @Descrpiton:不会飞的鸭子 + */ +public class FlyNoWay implements FlyBehavior { + @Override + public void fly() { + System.out.print("I can't Fly!\n"); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/FlyRocketPowered.java b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/FlyRocketPowered.java new file mode 100644 index 0000000..195e2a9 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/FlyRocketPowered.java @@ -0,0 +1,14 @@ +package com.coder.guoy.recyclerview.designpattern.strategy; + +/** + * @Version: + * @Author: + * @CreateTime:2017年5月15日 + * @Descrpiton: + */ +public class FlyRocketPowered implements FlyBehavior { + @Override + public void fly() { + System.out.println("火箭推进系统"); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/FlyWithThings.java b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/FlyWithThings.java new file mode 100644 index 0000000..94bad6d --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/FlyWithThings.java @@ -0,0 +1,14 @@ +package com.coder.guoy.recyclerview.designpattern.strategy; + +/** + * @Version: + * @Author: + * @CreateTime: + * @Descrpiton:真正会飞的 + */ +public class FlyWithThings implements FlyBehavior { + @Override + public void fly() { + System.out.print("I can Fly!\n"); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/MallardDuck.java b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/MallardDuck.java new file mode 100644 index 0000000..56c5899 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/MallardDuck.java @@ -0,0 +1,20 @@ +package com.coder.guoy.recyclerview.designpattern.strategy; + +/** + * @Version: + * @Author: + * @CreateTime: + * @Descrpiton: + */ +public class MallardDuck extends Duck { + + public MallardDuck() { + mQuackBehavior = new Quack(); + mFlyBehavior = new FlyWithThings(); + } + + @Override + public void display() { + System.out.print("我是一只绿色鸭子\n"); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/ModelDuck.java b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/ModelDuck.java new file mode 100644 index 0000000..2cdc0c6 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/ModelDuck.java @@ -0,0 +1,19 @@ +package com.coder.guoy.recyclerview.designpattern.strategy; + +/** + * @Version: + * @Author: + * @CreateTime:2017年5月15日 + * @Descrpiton: + */ +public class ModelDuck extends Duck { + public ModelDuck() { + mFlyBehavior = new FlyNoWay();//一开始,我们的模型鸭是不会飞的 + mQuackBehavior = new Quack(); + } + + @Override + public void display() { + System.out.println("我是模型鸭子\n"); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/MuteQuack.java b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/MuteQuack.java new file mode 100644 index 0000000..9cef359 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/MuteQuack.java @@ -0,0 +1,14 @@ +package com.coder.guoy.recyclerview.designpattern.strategy; + +/** + * @Version: + * @Author: + * @CreateTime:2017年5月15日 + * @Descrpiton:不会叫的 + */ +public class MuteQuack implements QuackBehavior { + @Override + public void quack() { + System.out.print("不会叫\n"); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/Quack.java b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/Quack.java new file mode 100644 index 0000000..069cfa2 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/Quack.java @@ -0,0 +1,14 @@ +package com.coder.guoy.recyclerview.designpattern.strategy; + +/** + * @Version: + * @Author: + * @CreateTime:2017年5月15日 + * @Descrpiton:真正会叫的鸭子 + */ +public class Quack implements QuackBehavior { + @Override + public void quack() { + System.out.print("鸭子呱呱叫\n"); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/QuackBehavior.java b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/QuackBehavior.java new file mode 100644 index 0000000..e013e9c --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/QuackBehavior.java @@ -0,0 +1,11 @@ +package com.coder.guoy.recyclerview.designpattern.strategy; + +/** + * @Version: + * @Author: + * @CreateTime:2017年5月15日 + * @Descrpiton: + */ +public interface QuackBehavior { + public void quack(); +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/Squeak.java b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/Squeak.java new file mode 100644 index 0000000..f29015f --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/designpattern/strategy/Squeak.java @@ -0,0 +1,15 @@ +package com.coder.guoy.recyclerview.designpattern.strategy; + +/** + * @Version: + * @Author: + * @CreateTime:2017年5月15日 + * @Descrpiton: + */ +public class Squeak implements QuackBehavior { + + @Override + public void quack() { + System.out.print("橡皮鸭吱吱叫\n"); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/ClassificationActivity.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/ClassificationActivity.java new file mode 100644 index 0000000..c2ccc01 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/ClassificationActivity.java @@ -0,0 +1,101 @@ +package com.coder.guoy.recyclerview.ui; + +import android.os.Build; +import android.os.Bundle; +import android.support.annotation.RequiresApi; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityClassificationBinding; +import com.coder.guoy.recyclerview.utils.ToastUtil; +import com.coder.guoy.recyclerview.view.classification.OnContentTextClickListener; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime: + * @Descrpiton:自定义组合控件 + */ +public class ClassificationActivity extends MvvmBaseActivity implements OnContentTextClickListener { + + private List list = new ArrayList(); + private List list2 = new ArrayList(); + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_classification); + showContentView(); + setTitle("自定义组合控件"); + initView(); + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + private void initView() { + list.add("民族餐厅"); + bindingView.classification.setIcon(getDrawable(R.drawable.classcyzs)); + bindingView.classification.setTitle("教育"); + bindingView.classification.setList(list); + bindingView.classification.setListener(this); + + list.add("有待抚恤啊"); + bindingView.classification2.setIcon(getDrawable(R.drawable.classmzzj)); + bindingView.classification2.setTitle("医疗"); + bindingView.classification2.setList(list); + bindingView.classification2.setListener(this); + + list.add("老年优待啊"); + bindingView.classification3.setIcon(getDrawable(R.drawable.classsbjy)); + bindingView.classification3.setTitle("水电"); + bindingView.classification3.setList(list); + bindingView.classification3.setListener(this); + + list.add("适龄入学"); + bindingView.classification4.setIcon(getDrawable(R.drawable.classwtyl)); + bindingView.classification4.setTitle("水电2"); + bindingView.classification4.setList(list); + bindingView.classification4.setListener(this); + + list.add("残疾康复"); + list2.add("111"); + list2.add("222"); + list2.add("333"); + list2.add("444"); + list2.add("555"); + list2.add("666"); + list2.add("777"); + bindingView.classification5.setIcon(getDrawable(R.drawable.classcsjz)); + bindingView.classification5.setTitle("水电3"); + bindingView.classification5.setList(list2); + bindingView.classification5.setListener(this); + + list.add("供电站"); + bindingView.classification6.setIcon(getDrawable(R.drawable.classjdbs)); + bindingView.classification6.setTitle("水电4"); + bindingView.classification6.setList(list); + bindingView.classification6.setListener(this); + + list.add("供水站"); + bindingView.classification7.setIcon(getDrawable(R.drawable.classjtcx)); + bindingView.classification7.setTitle("水电5"); + bindingView.classification7.setList(list); + bindingView.classification7.setListener(this); + + list.add("供水站2"); + bindingView.classification8.setIcon(getDrawable(R.drawable.classjtcx)); + bindingView.classification8.setTitle("水电6"); + bindingView.classification8.setList(list); + bindingView.classification8.setListener(this); + } + + @Override + public void onContentTextClick(CharSequence string) { + ToastUtil.show(string + ""); + } + + +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/ClassificationAdapterActivity.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/ClassificationAdapterActivity.java new file mode 100644 index 0000000..efeac1a --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/ClassificationAdapterActivity.java @@ -0,0 +1,117 @@ +package com.coder.guoy.recyclerview.ui; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.View; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityHometestBinding; +import com.coder.guoy.recyclerview.utils.ToastUtil; +import com.coder.guoy.recyclerview.view.alipay.ItemCallBackListener; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Version: + * @Author:Guoy + * @CreateTime:2017/7/22 + * @Descrpiton:仿支付宝全部小应用 + */ +public class ClassificationAdapterActivity extends MvvmBaseActivity implements ItemCallBackListener { + + private List list = new ArrayList(); + private List contentList = new ArrayList(); + private List contentList1 = new ArrayList(); + private List contentList2 = new ArrayList(); + private List contentList3 = new ArrayList(); + private List contentList4 = new ArrayList(); + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_hometest); + showContentView(); + setToolbarVisible(View.GONE); + initView(); + } + + private void initView() { + list.add("常用应用"); + list.add("管理决策"); + list.add("民生大数据"); + list.add("办事服务管理"); + + contentList4.add("数据决策"); + contentList4.add("共享开放"); + contentList4.add("数据统计"); + contentList4.add("精准查询"); + contentList4.add("采集维护"); + contentList4.add("服务管理"); + + contentList1.add("数据决策"); + contentList1.add("共享开放"); + + contentList2.add("数据统计"); + contentList2.add("精准查询"); + contentList2.add("采集维护"); + + contentList3.add("办事管理"); + contentList3.add("我的审批"); + contentList3.add("服务管理"); + contentList3.add("社事网络"); + contentList3.add("民政互动"); + contentList3.add("测试数据"); + contentList3.add("测试数据"); + contentList3.add("测试数据"); + contentList3.add("测试数据"); + contentList3.add("测试数据"); + contentList3.add("测试数据"); + contentList3.add("测试数据"); + + contentList.add(contentList4); + contentList.add(contentList1); + contentList.add(contentList2); + contentList.add(contentList3); + bindingView.classHome.setList(list, contentList); + bindingView.classHome.setItemCallBackListener(this); + } + + @Override + public void itemOnClick(int position, CharSequence text) { + ToastUtil.show(position + ";" + text); + switch (text.toString()) { + case "数据决策": + ToastUtil.show("数据决策"); + break; + case "共享开放": + ToastUtil.show("共享开放"); + break; + case "数据统计": + ToastUtil.show("数据统计"); + break; + case "精准查询": + ToastUtil.show("精准查询"); + break; + case "采集维护": + ToastUtil.show("采集维护"); + break; + case "办事管理": + ToastUtil.show("办事管理"); + break; + case "我的审批": + ToastUtil.show("我的审批"); + break; + case "服务管理": + ToastUtil.show("服务管理"); + break; + case "社事网络": + ToastUtil.show("社事网络"); + break; + case "民政互动": + ToastUtil.show("民政互动"); + break; + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/FreeVideoActivity.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/FreeVideoActivity.java new file mode 100644 index 0000000..9829934 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/FreeVideoActivity.java @@ -0,0 +1,34 @@ +package com.coder.guoy.recyclerview.ui; + +import android.os.Bundle; +import android.view.View; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityFreeVideoBinding; + +public class FreeVideoActivity extends MvvmBaseActivity { + + private String url = "http://2449.vod.myqcloud.com/2449_22ca37a6ea9011e5acaaf51d105342e3.f20.mp4"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); +// //设置无标题 +// requestWindowFeature(Window.FEATURE_NO_TITLE); +// //设置全屏 +// getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, +// WindowManager.LayoutParams.FLAG_FULLSCREEN); + setContentView(R.layout.activity_free_video); + showContentView(); + setToolbarVisible(View.GONE); + bindingView.videoview.setVideoPath(url); +// bindingView.videoview.setMediaController(new MediaController(this)); + } + + @Override + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + bindingView.videoview.start(); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayActivityTransitions.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayActivityTransitions.java new file mode 100644 index 0000000..3939025 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayActivityTransitions.java @@ -0,0 +1,54 @@ +package com.coder.guoy.recyclerview.ui; + +import android.app.ActivityOptions; +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.coder.guoy.recyclerview.R; + +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime: + * @Descrpiton:ActivityTransitions|转场动画 + */ +public class PlayActivityTransitions extends AppCompatActivity implements View.OnClickListener { + + private ImageView imageView; + private LinearLayout layoutGo; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_play_transitions); + TextView textView = (TextView) findViewById(R.id.textview_title); + FrameLayout layout = (FrameLayout) findViewById(R.id.toolbar_back); + layoutGo = (LinearLayout) findViewById(R.id.layout_go); + imageView = (ImageView) findViewById(R.id.image_go); + textView.setText("ActivityTransitions|转场动画"); + layout.setOnClickListener(this); + layoutGo.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.toolbar_back: + finish(); + break; + case R.id.layout_go: + Intent intent = new Intent(PlayActivityTransitions.this, + PlayStatusBar.class); + Bundle options = ActivityOptions.makeSceneTransitionAnimation( + this, imageView, "shareimage").toBundle(); + startActivity(intent, options); + break; + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayAnimateVectorDrawables.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayAnimateVectorDrawables.java new file mode 100644 index 0000000..9c0d2c2 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayAnimateVectorDrawables.java @@ -0,0 +1,95 @@ +package com.coder.guoy.recyclerview.ui; + +import android.graphics.drawable.Animatable; +import android.graphics.drawable.AnimatedVectorDrawable; +import android.os.Bundle; +import android.support.annotation.DrawableRes; +import android.view.View; +import android.widget.ImageView; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityPlayAnimateVectorDrawablesBinding; + +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年6月21日 + * @Descrpiton:AnimateVectorDrawables|矢量图片动画 + */ +public class PlayAnimateVectorDrawables extends MvvmBaseActivity implements View.OnClickListener { + private boolean isClick = true; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_play_animate_vector_drawables); + showContentView(); + setTitle("Animate Vector Drawables|矢量图片动画"); + bindingView.btnSuprise.setOnClickListener(this); + bindingView.imageSmile.setOnClickListener(this); + bindingView.imageRedheart.setOnClickListener(this); + bindingView.imageWindmill.setOnClickListener(this); + bindingView.imageMoto.setOnClickListener(this); + bindingView.imageAndroid.setOnClickListener(this); + bindingView.imageFingerprint.setOnClickListener(this); + bindingView.imageAstronaut.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.btn_suprise: + //bonc + bindingView.imageBonc.setVisibility(View.VISIBLE); + ((Animatable) bindingView.imageBonc.getDrawable()).start(); + //线性心 + bindingView.imageHeart.setVisibility(View.VISIBLE); + ((Animatable) bindingView.imageHeart.getDrawable()).start(); + break; + case R.id.image_smile://笑脸 + VectorDrawableClick(R.drawable.animated_face_to_happy, R.drawable.animated_face_to_sad, + bindingView.imageSmile); + break; + case R.id.image_redheart://红心 + VectorDrawableClick(R.drawable.animated_red_heart_full, R.drawable.animated_red_heart_empty, + bindingView.imageRedheart); + break; + case R.id.image_windmill://风车 旋转动画 需要group 指定pivotXY + ((AnimatedVectorDrawable) bindingView.imageWindmill.getDrawable()).start(); + break; + case R.id.image_moto://摩托车 位移动画 需要group + ((AnimatedVectorDrawable) bindingView.imageMoto.getDrawable()).start(); + break; + case R.id.image_android://机器人 缩放动画 需要group 指定pivotXY + ((AnimatedVectorDrawable) bindingView.imageAndroid.getDrawable()).start(); + break; + case R.id.image_fingerprint://指纹 透明动画 需要ObjectAnimator的porpertyName="fillAlpha" + ((AnimatedVectorDrawable) bindingView.imageFingerprint.getDrawable()).start(); + break; + case R.id.image_astronaut://宇航员 + ((AnimatedVectorDrawable) bindingView.imageAstronaut.getDrawable()).start(); + break; + } + } + + /** + * 点击启动SVG动画 + * 点击状态公用(待解决) + * + * @param drawablestart 开始效果 + * @param drawableend 结束效果 + * @param view 需要操作的View + */ + private void VectorDrawableClick(@DrawableRes int drawablestart, @DrawableRes int drawableend, + ImageView view) { + AnimatedVectorDrawable heartFull = (AnimatedVectorDrawable) getDrawable(drawablestart); + AnimatedVectorDrawable heartEmpty = (AnimatedVectorDrawable) getDrawable(drawableend); + AnimatedVectorDrawable heartAnimated = isClick ? heartFull : heartEmpty; + view.setImageDrawable(heartAnimated); + if (heartAnimated != null) { + heartAnimated.start(); + } + isClick = !isClick; + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayCardView.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayCardView.java new file mode 100644 index 0000000..233693c --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayCardView.java @@ -0,0 +1,25 @@ +package com.coder.guoy.recyclerview.ui; + +import android.os.Bundle; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityPlayCardViewBinding; + +/** + * @Version: + * @Author: + * @CreateTime:2017年5月12日 + * @Descrpiton:CardView + */ +public class PlayCardView extends MvvmBaseActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_play_card_view); + showContentView(); + setTitle("CardView"); + } + +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayCurvedMotion.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayCurvedMotion.java new file mode 100644 index 0000000..8c2bb43 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayCurvedMotion.java @@ -0,0 +1,101 @@ +package com.coder.guoy.recyclerview.ui; + +import android.animation.ObjectAnimator; +import android.graphics.Path; +import android.os.Bundle; +import android.util.DisplayMetrics; +import android.view.View; +import android.view.animation.AnimationUtils; +import android.widget.TextView; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityPlayCurvedMotionBinding; + + +/** + * @Version: + * @Author: + * @CreateTime:2017年6月14日 + * @Descrpiton:CurvedMotion|曲线运动 + */ +public class PlayCurvedMotion extends MvvmBaseActivity implements View.OnClickListener { + private ObjectAnimator animator; + private Path path; + private int width; + private int height; + private int accelerate_cubic = android.R.interpolator.accelerate_cubic; + private int accelerate_decelerate = android.R.interpolator.accelerate_decelerate; + private int accelerate_quad = android.R.interpolator.accelerate_quad; + private int accelerate_quint = android.R.interpolator.accelerate_quint; + private int anticipate = android.R.interpolator.anticipate; + private int anticipate_overshoot = android.R.interpolator.anticipate_overshoot; + private int bounce = android.R.interpolator.bounce; + private int cycle = android.R.interpolator.cycle; + private int decelerate_cubic = android.R.interpolator.decelerate_cubic; + private int decelerate_quad = android.R.interpolator.decelerate_quad; + private int decelerate_quint = android.R.interpolator.decelerate_quint; + private int fast_out_linear_in = android.R.interpolator.fast_out_linear_in; + private int fast_out_slow_in = android.R.interpolator.fast_out_slow_in; + private int linear = android.R.interpolator.linear; + private int linear_out_slow_in = android.R.interpolator.linear_out_slow_in; + private int overshoot = android.R.interpolator.overshoot; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_play_curved_motion); + showContentView(); + GetPiexels(); + setTitle("Curved Motion|曲线运动"); + bindingView.btnCurvedMotion.setOnClickListener(this); + } + + private void GetPiexels() { + DisplayMetrics metric = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(metric); + // 屏幕宽度(像素) + width = metric.widthPixels; + // 屏幕高度(像素) + height = metric.heightPixels; + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.btn_curved_motion: + setCurvedMotion(bindingView.imageCurved1, accelerate_cubic); + setCurvedMotion(bindingView.imageCurved2, accelerate_decelerate); + setCurvedMotion(bindingView.imageCurved3, accelerate_quad); + setCurvedMotion(bindingView.imageCurved4, accelerate_quint); + setCurvedMotion(bindingView.imageCurved5, anticipate); + setCurvedMotion(bindingView.imageCurved6, anticipate_overshoot); + setCurvedMotion(bindingView.imageCurved7, bounce); + setCurvedMotion(bindingView.imageCurved8, cycle); + setCurvedMotion(bindingView.imageCurved9, decelerate_cubic); + setCurvedMotion(bindingView.imageCurved10, decelerate_quad); + setCurvedMotion(bindingView.imageCurved11, decelerate_quint); + setCurvedMotion(bindingView.imageCurved12, fast_out_linear_in); + setCurvedMotion(bindingView.imageCurved13, fast_out_slow_in); + setCurvedMotion(bindingView.imageCurved14, linear); + setCurvedMotion(bindingView.imageCurved15, linear_out_slow_in); + setCurvedMotion(bindingView.imageCurved16, overshoot); + break; + } + } + + /** + * @param view + * @param interpolator + */ + private void setCurvedMotion(TextView view, int interpolator) { + path = new Path(); + path.moveTo(view.getLeft(), view.getTop()); + path.lineTo(view.getLeft(), 600); + animator = new ObjectAnimator().ofFloat(view, View.X, View.Y, path); + animator.setInterpolator(new AnimationUtils().loadInterpolator( + this, interpolator)); + animator.setDuration(2000); + animator.start(); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayFloatingActionButton.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayFloatingActionButton.java new file mode 100644 index 0000000..5024861 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayFloatingActionButton.java @@ -0,0 +1,36 @@ +package com.coder.guoy.recyclerview.ui; + +import android.os.Bundle; +import android.view.View; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityPlayFloatingActionButtonBinding; +import com.coder.guoy.recyclerview.utils.ToastUtil; + +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年4月28日 + * @Descrpiton:FloatingActionButton|悬浮按钮 + */ +public class PlayFloatingActionButton extends MvvmBaseActivity implements View.OnClickListener { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_play_floating_action_button); + showContentView(); + setTitle("FloatingActionButton"); + bindingView.fab.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.fab: + ToastUtil.show("FAB被点击"); + break; + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayMusic.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayMusic.java new file mode 100644 index 0000000..3028fa9 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayMusic.java @@ -0,0 +1,24 @@ +package com.coder.guoy.recyclerview.ui; + +import android.os.Bundle; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityPlayMusicBinding; +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年6月5日 + * @Descrpiton:自定义条形图 + */ +public class PlayMusic extends MvvmBaseActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_play_music); + showContentView(); + setTitle("自定义条形图"); + + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayRevealEffect.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayRevealEffect.java new file mode 100644 index 0000000..4526f07 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayRevealEffect.java @@ -0,0 +1,97 @@ +package com.coder.guoy.recyclerview.ui; + +import android.animation.Animator; +import android.os.Bundle; +import android.util.DisplayMetrics; +import android.view.View; +import android.view.ViewAnimationUtils; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityPlayRevealEffectBinding; + +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年6月13日 + * @Descrpiton:RevealEffect|揭示效果 + */ +public class PlayRevealEffect extends MvvmBaseActivity implements View.OnClickListener { + + private boolean isFirst = true; + private Animator animator; + private float width; + private float height; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_play_reveal_effect); + showContentView(); + GetPiexels(); + setTitle("Reveal Effect|揭示效果"); + bindingView.btnRevealeffect.setOnClickListener(this); + } + + private void GetPiexels() { + DisplayMetrics metric = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(metric); + // 屏幕宽度(像素) + width = metric.widthPixels; + // 屏幕高度(像素) + height = metric.heightPixels; + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.btn_revealeffect: + if (isFirst) { + animator = ViewAnimationUtils.createCircularReveal(bindingView.viewRevealeffect, + (int)(width / 2), + (int) (height / 2), + 0, + height + ); + isFirst = false; + } else { + animator = ViewAnimationUtils.createCircularReveal( + bindingView.viewRevealeffect, + 0, + 0, + height, + 0 + ); + isFirst = true; + } + animator.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + if (!isFirst) { + bindingView.viewRevealeffect.setVisibility(View.VISIBLE); + } + } + + @Override + public void onAnimationEnd(Animator animation) { + if (isFirst) { + bindingView.viewRevealeffect.setVisibility(View.INVISIBLE); + } + } + + @Override + public void onAnimationCancel(Animator animation) { + + } + + @Override + public void onAnimationRepeat(Animator animation) { + + } + }); + animator.setDuration(500); + animator.start(); + break; + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayShape.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayShape.java new file mode 100644 index 0000000..b4da864 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayShape.java @@ -0,0 +1,26 @@ +package com.coder.guoy.recyclerview.ui; + +import android.os.Bundle; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityPlayShapeBinding; + +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年6月8日 + * @Descrpiton:自定义图形 + */ +public class PlayShape extends MvvmBaseActivity { + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_play_shape); + showContentView(); + setTitle("Shape"); + } + +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayStatusBar.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayStatusBar.java new file mode 100644 index 0000000..46864f0 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayStatusBar.java @@ -0,0 +1,32 @@ +package com.coder.guoy.recyclerview.ui; + +import android.graphics.Color; +import android.os.Build; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.View; + +import com.coder.guoy.recyclerview.R; + +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年4月21日 + * @Descrpiton:StatusBar|透明状态栏 + */ +public class PlayStatusBar extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_play_status_bar); + + if (Build.VERSION.SDK_INT >= 21) { + View decorView = getWindow().getDecorView(); + int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; + decorView.setSystemUiVisibility(option); + getWindow().setStatusBarColor(Color.TRANSPARENT); + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayTextInputLayout.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayTextInputLayout.java new file mode 100644 index 0000000..a23fcc4 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayTextInputLayout.java @@ -0,0 +1,96 @@ +package com.coder.guoy.recyclerview.ui; + +import android.os.Bundle; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.View; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityPlayTextInputLayoutBinding; +import com.coder.guoy.recyclerview.utils.ToastUtil; +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年4月27日 + * @Descrpiton:TextInputLayout|文字输入布局 + */ +public class PlayTextInputLayout extends MvvmBaseActivity implements View.OnClickListener { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_play_text_input_layout); + showContentView(); + setTitle("用户登录"); + bindingView.btnLogin.setOnClickListener(this); + bindingView.textUsername.setHint("用户名/Email/手机号"); + bindingView.textPassword.setHint("密码"); + bindingView.edittextUsername.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + username(); + } + }); + bindingView.edittextPassword.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + password(); + } + }); + } + + private boolean username() { + if (TextUtils.isEmpty(bindingView.edittextUsername.getText())) { + bindingView.textUsername.setError("用户名/Email/手机号不能为空"); + return false; + } else { + bindingView.textUsername.setError(null); + } + return true; + } + + private boolean password() { + if (TextUtils.isEmpty(bindingView.edittextPassword.getText())) { + bindingView.textPassword.setError("密码不能为空"); + return false; + } else { + bindingView.textPassword.setError(null); + } + return true; + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.btn_login: + if (username() && password()) { + finish(); + ToastUtil.show("登录成功"); + } + break; + } + } + +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayTextView.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayTextView.java new file mode 100644 index 0000000..a26f543 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayTextView.java @@ -0,0 +1,26 @@ +package com.coder.guoy.recyclerview.ui; + +import android.os.Bundle; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityPlayTextViewBinding; + +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年6月2日 + * @Descrpiton:自定义文本 + */ +public class PlayTextView extends MvvmBaseActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_play_text_view); + showContentView(); + setTitle("自定义文本"); + bindingView.textRect.setText("矩形文本"); + bindingView.textShader.setText("Android Shader Text"); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayTouchFeedback.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayTouchFeedback.java new file mode 100644 index 0000000..a0615d1 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayTouchFeedback.java @@ -0,0 +1,24 @@ +package com.coder.guoy.recyclerview.ui; + +import android.os.Bundle; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityPlayTouchFeedbackBinding; + +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年6月12日 + * @Descrpiton:TouchFeedback|触摸反馈 + */ +public class PlayTouchFeedback extends MvvmBaseActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_play_touch_feedback); + showContentView(); + setTitle("Touch Feedback|触摸反馈"); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayViewStateChange.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayViewStateChange.java new file mode 100644 index 0000000..39bfd5c --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/PlayViewStateChange.java @@ -0,0 +1,24 @@ +package com.coder.guoy.recyclerview.ui; + +import android.os.Bundle; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityPlayViewStateChangeBinding; + +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年6月19日 + * @Descrpiton:ViewstateChanges|视图状态改变 + */ +public class PlayViewStateChange extends MvvmBaseActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_play_view_state_change); + showContentView(); + setTitle("View State Changes|视图状态改变"); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/animation/DrawableAnimation.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/animation/DrawableAnimation.java new file mode 100644 index 0000000..46c3c80 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/animation/DrawableAnimation.java @@ -0,0 +1,32 @@ +package com.coder.guoy.recyclerview.ui.animation; + +import android.graphics.drawable.AnimationDrawable; +import android.os.Bundle; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityDrawableAnimationBinding; + +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年5月5日 + * @Descrpiton:帧动画 + */ +public class DrawableAnimation extends MvvmBaseActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_drawable_animation); + showContentView(); + setTitle("帧动画"); + } + + @Override + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + AnimationDrawable animationDrawable = (AnimationDrawable) bindingView.drawableAnimation.getDrawable(); + animationDrawable.start(); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/animation/PropertyAnimation.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/animation/PropertyAnimation.java new file mode 100644 index 0000000..033d860 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/animation/PropertyAnimation.java @@ -0,0 +1,139 @@ +package com.coder.guoy.recyclerview.ui.animation; + +import android.animation.ObjectAnimator; +import android.content.Context; +import android.os.Bundle; +import android.view.View; +import android.view.WindowManager; +import android.view.animation.LayoutAnimationController; +import android.view.animation.ScaleAnimation; +import android.widget.RelativeLayout; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityPropertyAnimationBinding; + +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年5月10日 + * @Descrpiton:属性动画 + */ +public class PropertyAnimation extends MvvmBaseActivity implements View.OnClickListener { + + private WindowManager manager; + private int width; + private int height; + private ObjectAnimator alpha; + private ObjectAnimator scaleX; + private ObjectAnimator scaleY; + private ObjectAnimator translateX; + private ObjectAnimator translateY; + private ObjectAnimator rotation; + private ObjectAnimator rotationX; + private ObjectAnimator rotationY; + public static final int TIME = 2000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_property_animation); + showContentView(); + initView(); + initListener(); + initAnimatior(); + } + + private void initView() { + manager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); + //获取屏幕宽高 + width = manager.getDefaultDisplay().getWidth(); + height = manager.getDefaultDisplay().getHeight(); + setTitle("Property Animation"); + } + + private void initListener() { + bindingView.btnAlpah.setOnClickListener(this); + bindingView.scalex.setOnClickListener(this); + bindingView.scaley.setOnClickListener(this); + bindingView.rotation.setOnClickListener(this); + bindingView.rotationx.setOnClickListener(this); + bindingView.rotationy.setOnClickListener(this); + bindingView.translatex.setOnClickListener(this); + bindingView.translatey.setOnClickListener(this); + } + + private void initAnimatior() { + //alpha:透明度 默认值是1(不透明),0代表完全透明(不可见) + alpha = ObjectAnimator.ofFloat(bindingView.imageviewMove, "alpha", 1, 0, 1); + //scaleX和scaleY:围绕支点进行2D缩放 0是缩放到无,1是本身大小 + scaleX = ObjectAnimator.ofFloat(bindingView.imageviewMove, "scaleX", 1f, 1.4f, 1f); + scaleY = ObjectAnimator.ofFloat(bindingView.imageviewMove, "scaleY", 1f, 1.4f, 1f); + //translationX和translationY:控制View在布局中的位置,可以理解为位移 + translateX = ObjectAnimator.ofFloat(bindingView.imageviewMove, "translationX", 0, -width, 0); + translateY = ObjectAnimator.ofFloat(bindingView.imageviewMove, "translationY", 0, -height, 0); + //rotation、rotationX和rotationY: 控制View围绕支点的2D和3D旋转 + rotation = ObjectAnimator.ofFloat(bindingView.imageviewMove, "rotation", 0, 60, 0); + rotationX = ObjectAnimator.ofFloat(bindingView.imageviewMove, "rotationX", 0, 60, 0); + rotationY = ObjectAnimator.ofFloat(bindingView.imageviewMove, "rotationY", 0, 60, 0); + //组合动画 + //AnimatorSet set = new AnimatorSet(); + //set.playToghter() 同时执行多个 + //set.after(Animator anim) 将现有动画插入到传入的动画之后执行 + //set.after(long delay) 将现有动画延迟指定毫秒后执行 + //set.before(Animator anim) 将现有动画插入到传入的动画之前执行 + //set.with(Animator anim) 将现有动画和传入的动画同时执行 + } + + @Override + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + RelativeLayout rl = (RelativeLayout) findViewById(R.id.relativelayout); + //设置过度动画 + ScaleAnimation scale = new ScaleAnimation(0, 1, 0, 1); + scale.setDuration(500); + //设置布局动画的显示属性 LayoutAnimationController参数(需要作用的动画,每个子View显示的Delay时间) + LayoutAnimationController lac = new LayoutAnimationController(scale, 0.5f); + //当delay时间不为0时,可以设置子View的显示顺序 顺序-NORMAL 随机-RANDOM 反序REVERSE + lac.setOrder(LayoutAnimationController.ORDER_NORMAL); + rl.setLayoutAnimation(lac); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.btn_alpah: + alpha.setDuration(TIME); + alpha.start(); + break; + case R.id.scalex: + scaleX.setDuration(TIME); + scaleX.start(); + break; + case R.id.scaley: + scaleY.setDuration(TIME); + scaleY.start(); + break; + case R.id.translatex: + translateX.setDuration(TIME); + translateX.start(); + break; + case R.id.translatey: + translateY.setDuration(TIME); + translateY.start(); + break; + case R.id.rotation: + rotation.setDuration(TIME); + rotation.start(); + break; + case R.id.rotationx: + rotationX.setDuration(TIME); + rotationX.start(); + break; + case R.id.rotationy: + rotationY.setDuration(TIME); + rotationY.start(); + break; + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/animation/ViewAnimation.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/animation/ViewAnimation.java new file mode 100644 index 0000000..6c6acab --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/animation/ViewAnimation.java @@ -0,0 +1,90 @@ +package com.coder.guoy.recyclerview.ui.animation; + +import android.os.Bundle; +import android.view.View; +import android.view.animation.AlphaAnimation; +import android.view.animation.Animation; +import android.view.animation.AnimationSet; +import android.view.animation.RotateAnimation; +import android.view.animation.ScaleAnimation; +import android.view.animation.TranslateAnimation; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityViewAnimationBinding; + +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年5月5日 + * @Descrpiton:视图动画 + */ +public class ViewAnimation extends MvvmBaseActivity implements View.OnClickListener { + + private static final int DURATION = 1000; + private AlphaAnimation alpha; + private RotateAnimation rotate; + private TranslateAnimation translate; + private ScaleAnimation scale; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_view_animation); + showContentView(); + initAnimation(); + initListener(); + setTitle("视图动画"); + } + + private void initListener() { + bindingView.alpha.setOnClickListener(this); + bindingView.rotate.setOnClickListener(this); + bindingView.translate.setOnClickListener(this); + bindingView.scale.setOnClickListener(this); + bindingView.set.setOnClickListener(this); + } + + private void initAnimation() { + alpha = new AlphaAnimation(0, 1); + alpha.setDuration(DURATION); + rotate = new RotateAnimation(0, 360, + RotateAnimation.RELATIVE_TO_SELF, 0.5f, + RotateAnimation.RELATIVE_TO_SELF, 0.5f); + rotate.setDuration(DURATION); + translate = new TranslateAnimation( + TranslateAnimation.RELATIVE_TO_SELF, -200, + TranslateAnimation.RELATIVE_TO_SELF, 0); + translate.setDuration(DURATION); + scale = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f, + Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); + scale.setDuration(DURATION); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.alpha: + bindingView.imageView.startAnimation(alpha); + break; + case R.id.rotate: + bindingView.imageView.startAnimation(rotate); + break; + case R.id.translate: + bindingView.imageView.startAnimation(translate); + break; + case R.id.scale: + bindingView.imageView.startAnimation(scale); + break; + case R.id.set: + AnimationSet set = new AnimationSet(true); + set.setDuration(DURATION); + set.addAnimation(alpha); + set.addAnimation(rotate); + set.addAnimation(translate); + set.addAnimation(scale); + bindingView.imageView.startAnimation(set); + break; + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/bottomsheet/BottomDialogAdapter.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/bottomsheet/BottomDialogAdapter.java new file mode 100644 index 0000000..38fbb70 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/bottomsheet/BottomDialogAdapter.java @@ -0,0 +1,68 @@ +package com.coder.guoy.recyclerview.ui.bottomsheet; + +import android.content.Context; +import android.databinding.DataBindingUtil; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.databinding.ItemSampleBinding; +import com.coder.guoy.recyclerview.utils.ToastUtil; + +import java.util.List; + +/** + * @Version: + * @Author:Guoy + * @CreateTime:2017/6/1 + * @Descrpiton: + */ +public class BottomDialogAdapter extends RecyclerView.Adapter { + private List mList; + private LayoutInflater mInflater; + private Context mContext; + private ItemSampleBinding normalBinding; + + public BottomDialogAdapter(Context context, List list) { + mInflater = LayoutInflater.from(context); + mList = list; + mContext = context; + } + + // 获取条目数量 + @Override + public int getItemCount() { + return mList.size(); + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + normalBinding = DataBindingUtil.inflate(mInflater, R.layout.item_sample, parent, false); + return new NormalViewHolder(normalBinding.getRoot()); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { + NormalViewHolder vh = (NormalViewHolder) holder; + vh.text.setText("条目:" + position); + vh.text.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ToastUtil.show(position + "被点击"); + } + }); + } + + private class NormalViewHolder extends RecyclerView.ViewHolder { + public TextView text; + + public NormalViewHolder(View itemView) { + super(itemView); + text = normalBinding.itemTextview; + } + } + +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/bottomsheet/PlayBottomSheetDialog.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/bottomsheet/PlayBottomSheetDialog.java new file mode 100644 index 0000000..8a1d7dc --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/bottomsheet/PlayBottomSheetDialog.java @@ -0,0 +1,82 @@ +package com.coder.guoy.recyclerview.ui.bottomsheet; + +import android.os.Bundle; +import android.support.design.widget.BottomSheetDialog; +import android.support.v7.widget.DefaultItemAnimator; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityPlayBottomSheetDialogBinding; +import com.coder.guoy.recyclerview.utils.ToastUtil; + +import java.util.ArrayList; +import java.util.List; + +public class PlayBottomSheetDialog extends MvvmBaseActivity implements View.OnClickListener { + + private BottomSheetDialog bsd1; + private BottomSheetDialog bsd2; + private BottomDialogAdapter adapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_play_bottom_sheet_dialog); + showContentView(); + setTitle("BottomSheetDialog"); + bindingView.btnBsd1.setOnClickListener(this); + bindingView.btnBsd2.setOnClickListener(this); + initView(); + } + + private void initView() { + View view = View.inflate(this, R.layout.bottom_dialog, null); + ImageView man = (ImageView) view.findViewById(R.id.image_man); + ImageView women = (ImageView) view.findViewById(R.id.image_women); + man.setOnClickListener(this); + women.setOnClickListener(this); + + bsd1 = new BottomSheetDialog(this); + bsd1.setContentView(view); + bsd1.setCanceledOnTouchOutside(true); + + List list = new ArrayList(); + for (int i = 1; i <= 10; i++) { + list.add("" + i); + } + + RecyclerView recyclerView = (RecyclerView) LayoutInflater.from(this).inflate(R.layout.item_recycler, null); + recyclerView.setItemAnimator(new DefaultItemAnimator()); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + adapter = new BottomDialogAdapter(this, list); + recyclerView.setAdapter(adapter); + + bsd2 = new BottomSheetDialog(this); + bsd2.setContentView(recyclerView); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.btn_bsd1: + bsd1.show(); + break; + case R.id.btn_bsd2: + bsd2.show(); + break; + case R.id.image_man: + ToastUtil.show("男"); + bsd1.dismiss(); + break; + case R.id.image_women: + ToastUtil.show("女"); + bsd1.dismiss(); + break; + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/cache/CacheActivity.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/cache/CacheActivity.java new file mode 100644 index 0000000..eb7893b --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/cache/CacheActivity.java @@ -0,0 +1,108 @@ +package com.coder.guoy.recyclerview.ui.cache; + +import android.databinding.DataBindingUtil; +import android.graphics.Color; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.View; + +import com.coder.guoy.recyclerview.Constants; +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.api.bean.ImageBean; +import com.coder.guoy.recyclerview.databinding.ActivityCacheBinding; +import com.coder.guoy.recyclerview.utils.ToastUtil; + +import java.util.List; + +import rx.Observer; +import rx.Subscription; + +public class CacheActivity extends AppCompatActivity implements View.OnClickListener { + private ActivityCacheBinding binding; + private CacheAdapter adapter; + private long startTime; + protected Subscription subscription; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = DataBindingUtil.setContentView(this, R.layout.activity_cache); + transparentStatusBar(); + initRecyclerView(binding.recyclerviewModel2); + binding.btn1.setOnClickListener(this); + binding.btn2.setOnClickListener(this); + binding.btn3.setOnClickListener(this); + //最新 + getNetData(Constants.ZMBZ); + } + + // TODO: 透明状态栏 + private void transparentStatusBar() { + View decorView = getWindow().getDecorView(); + int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; + decorView.setSystemUiVisibility(option); + getWindow().setStatusBarColor(Color.TRANSPARENT); + } + + //TODO: 获取网络数据 + private void getNetData(final String url) { + startTime = System.currentTimeMillis(); + unsubscribe(); + subscription = Data.getInstance().subscribeData(new Observer>() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + Log.i("cache_onError", e.toString()); + } + + @Override + public void onNext(List imageBeen) { + int loadTime = (int) (System.currentTimeMillis() - startTime); + Log.i("cache_onNext", loadTime + "ms"); + adapter.setNewData(imageBeen); + } + }, url); + } + + // TODO: 图片列表 + private void initRecyclerView(RecyclerView recyclerView) { + adapter = new CacheAdapter(this); + GridLayoutManager mLayoutManager = new GridLayoutManager(this, 2); + recyclerView.setLayoutManager(mLayoutManager); + recyclerView.setAdapter(adapter); + recyclerView.setNestedScrollingEnabled(false); + } + + protected void unsubscribe() { + if (subscription != null && !subscription.isUnsubscribed()) { + subscription.unsubscribe(); + } + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.btn_1: + Data.getInstance().clearMemoryCache(); + ToastUtil.show("内存缓存已清空"); + adapter.removeItems(null); + break; + case R.id.btn_2: + Data.getInstance().clearMemoryAndDiskCache(); + ToastUtil.show("内存缓存和磁盘缓存已清空"); + adapter.removeItems(null); + break; + case R.id.btn_3: + getNetData(Constants.ZMBZ); + break; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/cache/CacheAdapter.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/cache/CacheAdapter.java new file mode 100644 index 0000000..a2ffaa5 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/cache/CacheAdapter.java @@ -0,0 +1,85 @@ +package com.coder.guoy.recyclerview.ui.cache; + +import android.content.Context; +import android.databinding.DataBindingUtil; +import android.support.v7.widget.CardView; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.api.bean.ImageBean; +import com.coder.guoy.recyclerview.databinding.ItemCacheBinding; +import com.coder.guoy.recyclerview.utils.GlideUtils; + +import java.util.List; + +/** + * @Version:V1.0 + * @Author:CoderGuoy + * @CreateTime:2017年12月22日 + * @Descrpiton: + */ +public class CacheAdapter extends RecyclerView.Adapter { + private List mList; + private LayoutInflater mInflater; + private Context mContext; + private ItemCacheBinding binding; + + public CacheAdapter(Context context) { + mInflater = LayoutInflater.from(context); + mContext = context; + } + + // 获取条目数量 + @Override + public int getItemCount() { + return mList == null ? 0 : mList.size(); + } + + public void setNewData(List data) { + mList = data; + notifyDataSetChanged(); + } + + public void removeItems(List mList) { + this.mList = mList; + notifyDataSetChanged(); + } + + private class NormalViewHolder extends RecyclerView.ViewHolder { + public ImageView imageView; + public TextView textTitle; + public CardView cardView; + + public NormalViewHolder(View itemView) { + super(itemView); + imageView = binding.itemImage; + textTitle = binding.itemText; + cardView = binding.cardview; + } + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + binding = DataBindingUtil.inflate(mInflater, R.layout.item_cache, parent, false); + return new NormalViewHolder(binding.getRoot()); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { + final NormalViewHolder vh = (NormalViewHolder) holder; + //设置图片 + if (mList.get(position).getImageUrl() != null) { + GlideUtils.setImage(mContext,mList.get(position).getImageUrl(), vh.imageView); + } + //设置标题 + if (mList.get(position).getImgaeTitle() != null) { + vh.textTitle.setText(mList.get(position).getImgaeTitle()); + } + } + +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/cache/Data.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/cache/Data.java new file mode 100644 index 0000000..af18394 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/cache/Data.java @@ -0,0 +1,157 @@ +// (c)2016 Flipboard Inc, All Rights Reserved. + +package com.coder.guoy.recyclerview.ui.cache; + +import android.support.annotation.IntDef; +import android.support.annotation.NonNull; + +import com.coder.guoy.recyclerview.Constants; +import com.coder.guoy.recyclerview.api.bean.ImageBean; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import rx.Observable; +import rx.Observer; +import rx.Subscriber; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Action1; +import rx.schedulers.Schedulers; +import rx.subjects.BehaviorSubject; + +public class Data { + private static Data instance; + private static final int DATA_SOURCE_MEMORY = 1; + private static final int DATA_SOURCE_DISK = 2; + private static final int DATA_SOURCE_NETWORK = 3; + + @IntDef({DATA_SOURCE_MEMORY, DATA_SOURCE_DISK, DATA_SOURCE_NETWORK}) + @interface DataSource { + } + + BehaviorSubject> cache; + + private int dataSource; + + private Data() { + } + + public static Data getInstance() { + if (instance == null) { + instance = new Data(); + } + return instance; + } + + private void setDataSource(@DataSource int dataSource) { + this.dataSource = dataSource; + } + + public void loadFromNetwork(final String url) { + Observable> observable = Observable.create(new Observable.OnSubscribe>() { + @Override + public void call(Subscriber> subscriber) { + List list = new ArrayList<>(); + try { + Document document = Jsoup.connect(url).get(); + Elements main_cont = document.getElementsByClass("main_cont"); + Document parse = Jsoup.parse(main_cont.toString()); + Element imageLists = parse.getElementsByClass("list_cont list_cont1 w1180").get(0); + Elements li = imageLists.select("li"); + for (Element imageList : li) { + //详细页连接 + String linkUrl = imageList.select("a").first().attr("href"); + if (!linkUrl.startsWith(Constants.BZ_URl)) { + linkUrl = Constants.BZ_URl + linkUrl.substring(1); + } + //图片标题 + String imgaeTitle = imageList.select("p").text(); + + Document document2 = Jsoup.connect(linkUrl).get(); + Elements main_cont2 = document2.getElementsByClass("pic_main"); + Document parse2 = Jsoup.parse(main_cont2.toString()); + Elements imageLists2 = parse2.getElementsByClass("pic-meinv"); + //图片地址 + String imgUrl = imageLists2.select("img").first().attr("src"); + + list.add(new ImageBean(linkUrl, imgUrl, imgaeTitle)); + } + subscriber.onNext(list); + subscriber.onCompleted(); + } catch (IOException e) { + subscriber.onError(e); + } + } + }); + + observable + .subscribeOn(Schedulers.io()) + .doOnNext(new Action1>() { + @Override + public void call(List imageBeen) { + //写入磁盘缓存 + Database.getInstance().writeItems(imageBeen); + } + }) + .subscribe(new Action1>() { + @Override + public void call(List imageBeen) { + //写入内存缓存 + cache.onNext(imageBeen); + cache.onCompleted(); + } + }, new Action1() { + @Override + public void call(Throwable throwable) { + cache.onError(throwable); + } + }); + } + + public Subscription subscribeData(@NonNull Observer> observer, final String url) { + if (cache == null) { + cache = BehaviorSubject.create(); + Observable.create(new Observable.OnSubscribe>() { + @Override + public void call(Subscriber> subscriber) { + List items = Database.getInstance().readItems(); + if (items == null) { + setDataSource(DATA_SOURCE_NETWORK); + loadFromNetwork(url); + } else { + setDataSource(DATA_SOURCE_DISK); + subscriber.onNext(items); + } + } + }) + .subscribeOn(Schedulers.io()) + .subscribe(cache); + } else { + setDataSource(DATA_SOURCE_MEMORY); + } + return cache + .doOnError(new Action1() { + @Override + public void call(Throwable throwable) { + cache = null; + } + }) + .observeOn(AndroidSchedulers.mainThread()).subscribe(observer); + } + + public void clearMemoryCache() { + cache = null; + } + + public void clearMemoryAndDiskCache() { + clearMemoryCache(); + Database.getInstance().delete(); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/cache/Database.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/cache/Database.java new file mode 100644 index 0000000..ac36723 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/cache/Database.java @@ -0,0 +1,76 @@ +// (c)2016 Flipboard Inc, All Rights Reserved. + +package com.coder.guoy.recyclerview.ui.cache; + +import com.coder.guoy.recyclerview.App; +import com.coder.guoy.recyclerview.api.bean.ImageBean; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; +import java.util.List; + +public class Database { + private static String DATA_FILE_NAME = "tuku_data.db"; + + private static Database INSTANCE; + + File dataFile = new File(App.getInstance().getFilesDir(), DATA_FILE_NAME); + Gson gson = new Gson(); + + private Database() { + } + + public static Database getInstance() { + if (INSTANCE == null) { + INSTANCE = new Database(); + } + return INSTANCE; + } + + public List readItems() { + // Hard code adding some delay, to distinguish reading from memory and reading disk clearly + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + try { + Reader reader = new FileReader(dataFile); + return gson.fromJson(reader, new TypeToken>() { + }.getType()); + } catch (FileNotFoundException e) { + e.printStackTrace(); + return null; + } + } + + public void writeItems(List items) { + String json = gson.toJson(items); + try { + if (!dataFile.exists()) { + try { + dataFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + Writer writer = new FileWriter(dataFile); + writer.write(json); + writer.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void delete() { + dataFile.delete(); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/coordinator/AppBehavior.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/coordinator/AppBehavior.java new file mode 100644 index 0000000..c163365 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/coordinator/AppBehavior.java @@ -0,0 +1,43 @@ +package com.coder.guoy.recyclerview.ui.coordinator; + +import android.content.Context; +import android.support.design.widget.AppBarLayout; +import android.support.design.widget.CoordinatorLayout; +import android.support.v4.view.ViewCompat; +import android.util.AttributeSet; +import android.view.View; + +/** + * @Version: + * @Author: + * @CreateTime: + * @Descrpiton: + */ +public class AppBehavior extends CoordinatorLayout.Behavior { + + private int directionChange; + + public AppBehavior(Context context, AttributeSet attrs) { + super(context, attrs); + } + + //判断滑动的方向 返回垂直滑动 + @Override + public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View directTargetChild, View target, int nestedScrollAxes) { + return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0; + } + + //根据滑动的距离显示和隐藏 child + @Override + public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed) { + if (dy > 0 && directionChange < 0 || dy < 0 && directionChange > 0) { + directionChange = 0; + } + directionChange += dy; + if (directionChange > child.getHeight() && child.getVisibility() == View.VISIBLE) { + child.setVisibility(View.GONE); + } else if (directionChange < 0 && child.getVisibility() == View.GONE) { + child.setVisibility(View.VISIBLE); + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/coordinator/FabBehavior.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/coordinator/FabBehavior.java new file mode 100644 index 0000000..36bac91 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/coordinator/FabBehavior.java @@ -0,0 +1,43 @@ +package com.coder.guoy.recyclerview.ui.coordinator; + +import android.content.Context; +import android.support.design.widget.CoordinatorLayout; +import android.support.design.widget.FloatingActionButton; +import android.support.v4.view.ViewCompat; +import android.util.AttributeSet; +import android.view.View; + +/** + * @Version: + * @Author: + * @CreateTime: + * @Descrpiton: + */ +public class FabBehavior extends CoordinatorLayout.Behavior { + + private int directionChange; + + public FabBehavior(Context context, AttributeSet attrs) { + super(context, attrs); + } + + //判断滑动的方向 返回垂直滑动 + @Override + public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) { + return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0; + } + + //根据滑动的距离显示和隐藏 child + @Override + public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dx, int dy, int[] consumed) { + if (dy > 0 && directionChange < 0 || dy < 0 && directionChange > 0) { + directionChange = 0; + } + directionChange += dy; + if (directionChange > child.getHeight() && child.getVisibility() == View.VISIBLE) { + child.setVisibility(View.GONE); + } else if (directionChange < 0 && child.getVisibility() == View.GONE) { + child.setVisibility(View.VISIBLE); + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/coordinator/PlayCoordinatorBehavior.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/coordinator/PlayCoordinatorBehavior.java new file mode 100644 index 0000000..440ff61 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/coordinator/PlayCoordinatorBehavior.java @@ -0,0 +1,45 @@ +package com.coder.guoy.recyclerview.ui.coordinator; + +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.view.View; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityPlayCoordinatorBehaviorBinding; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年5月2日 + * @Descrpiton:CoordinatorLayout.Behavior自定义行为的协调布局 + */ +public class PlayCoordinatorBehavior extends MvvmBaseActivity implements View.OnClickListener { + private List mList = new ArrayList(); + private LinearLayoutManager mLayoutManager; + private RecyclerViewAdapter adapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_play_coordinator_behavior); + showContentView(); + setToolbarVisible(View.GONE); + bindingView.imageviewBack.setOnClickListener(this); + for (int i = 1; i <= 20; i++) { + mList.add("Recycler条目:" + i); + } + adapter = new RecyclerViewAdapter(this, mList); + mLayoutManager = new LinearLayoutManager(getApplicationContext()); + bindingView.recyclerview.setLayoutManager(mLayoutManager); + bindingView.recyclerview.setAdapter(adapter); + } + + @Override + public void onClick(View v) { + finish(); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/coordinator/PlayCoordinatorLayout.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/coordinator/PlayCoordinatorLayout.java new file mode 100644 index 0000000..ef2bb84 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/coordinator/PlayCoordinatorLayout.java @@ -0,0 +1,45 @@ +package com.coder.guoy.recyclerview.ui.coordinator; + +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.view.View; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityPlayCoordinatorLayoutBinding; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年5月2日 + * @Descrpiton:CoordinatorLayout协调布局 + */ +public class PlayCoordinatorLayout extends MvvmBaseActivity implements View.OnClickListener { + private List mList = new ArrayList(); + private LinearLayoutManager mLayoutManager; + private RecyclerViewAdapter adapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_play_coordinator_layout); + showContentView(); + setToolbarVisible(View.GONE); + bindingView.imageviewBack.setOnClickListener(this); + for (int i = 1; i <= 20; i++) { + mList.add("Recycler条目:" + i); + } + adapter = new RecyclerViewAdapter(this, mList); + mLayoutManager = new LinearLayoutManager(getApplicationContext()); + bindingView.recyclerview.setLayoutManager(mLayoutManager); + bindingView.recyclerview.setAdapter(adapter); + } + + @Override + public void onClick(View v) { + finish(); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/coordinator/PlayCoordinatorToolbar.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/coordinator/PlayCoordinatorToolbar.java new file mode 100644 index 0000000..4a085b3 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/coordinator/PlayCoordinatorToolbar.java @@ -0,0 +1,38 @@ +package com.coder.guoy.recyclerview.ui.coordinator; + +import android.graphics.Color; +import android.os.Bundle; +import android.view.View; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityPlayCoordinatorToolbarBinding; + +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年4月24日 + * @Descrpiton:CoordinatorLayout,APPBarLayout,CollapsingTabLayout实现折叠头布局 + * @updataTime:2017年5月21日 + * @Description:CollapsingTollBarLayoutUpData + */ +public class PlayCoordinatorToolbar extends MvvmBaseActivity implements View.OnClickListener { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_play_coordinator_toolbar); + showContentView(); + setToolbarVisible(View.GONE); + //设置Collapsing折叠后文字颜色 + bindingView.collapsingtoolbar.setCollapsedTitleTextColor(Color.WHITE); + //设置Collapsing未折叠文字颜色 + bindingView.collapsingtoolbar.setExpandedTitleColor(Color.BLACK); + bindingView.imageviewBack.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + finish(); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/coordinator/RecyclerViewAdapter.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/coordinator/RecyclerViewAdapter.java new file mode 100644 index 0000000..2fa2642 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/coordinator/RecyclerViewAdapter.java @@ -0,0 +1,58 @@ +package com.coder.guoy.recyclerview.ui.coordinator; + +import android.content.Context; +import android.databinding.DataBindingUtil; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.databinding.ItemSampleBinding; +import com.coder.guoy.recyclerview.databinding.ItemWelfareFooterBinding; + +import java.util.List; + + +public class RecyclerViewAdapter extends RecyclerView.Adapter { + private List mList; + private LayoutInflater mInflater; + private Context mContext; + private ItemSampleBinding normalBinding; + private ItemWelfareFooterBinding footBinding; + + public RecyclerViewAdapter(Context context, List list) { + mInflater = LayoutInflater.from(context); + mList = list; + mContext = context; + } + + @Override + public int getItemCount() { + return mList.size(); + } + + private class NormalViewHolder extends RecyclerView.ViewHolder { + public TextView textView; + + public NormalViewHolder(View itemView) { + super(itemView); + textView = normalBinding.itemTextview; + } + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + normalBinding = DataBindingUtil.inflate(mInflater, R.layout.item_sample, parent, false); + return new NormalViewHolder(normalBinding.getRoot()); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { + NormalViewHolder vh = (NormalViewHolder) holder; + vh.textView.setText(mList.get(position)); + } + +} + diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/holder/AnimationHolder.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/holder/AnimationHolder.java new file mode 100644 index 0000000..8fbaf41 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/holder/AnimationHolder.java @@ -0,0 +1,50 @@ +package com.coder.guoy.recyclerview.ui.holder; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityAnimationHolderBinding; +import com.coder.guoy.recyclerview.ui.animation.DrawableAnimation; +import com.coder.guoy.recyclerview.ui.animation.PropertyAnimation; +import com.coder.guoy.recyclerview.ui.animation.ViewAnimation; + +/** + * @Version: + * @Author: + * @CreateTime:2017年5月31日 + * @Descrpiton: + */ +public class AnimationHolder extends MvvmBaseActivity implements View.OnClickListener { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_animation_holder); + showContentView(); + setTitle("Animation"); + bindingView.button12.setOnClickListener(this); + bindingView.button13.setOnClickListener(this); + bindingView.button14.setOnClickListener(this); + } + + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.button12: + startActivity(new Intent(AnimationHolder.this, DrawableAnimation.class)); + break; + case R.id.button13: + startActivity(new Intent(AnimationHolder.this, ViewAnimation.class)); + break; + case R.id.button14: + startActivity(new Intent(AnimationHolder.this, PropertyAnimation.class)); + break; + } + } + + +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/holder/CustomizeHolder.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/holder/CustomizeHolder.java new file mode 100644 index 0000000..b926dd3 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/holder/CustomizeHolder.java @@ -0,0 +1,63 @@ +package com.coder.guoy.recyclerview.ui.holder; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityCustomizeHolderBinding; +import com.coder.guoy.recyclerview.ui.ClassificationActivity; +import com.coder.guoy.recyclerview.ui.ClassificationAdapterActivity; +import com.coder.guoy.recyclerview.ui.PlayMusic; +import com.coder.guoy.recyclerview.ui.PlayShape; +import com.coder.guoy.recyclerview.ui.PlayTextView; +import com.coder.guoy.recyclerview.ui.tagcloud.TagCloudActivity; + +/** + * @Version: + * @Author: + * @CreateTime:2017年6月1日 + * @Descrpiton:自定义 + */ +public class CustomizeHolder extends MvvmBaseActivity implements View.OnClickListener { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_customize_holder); + showContentView(); + setTitle("Customize|自定义"); + bindingView.btnTagcloud.setOnClickListener(this); + bindingView.btnCombination.setOnClickListener(this); + bindingView.btnRecttextview.setOnClickListener(this); + bindingView.btnView.setOnClickListener(this); + bindingView.btnXmlShape.setOnClickListener(this); + bindingView.btnXmlSelector.setOnClickListener(this); + bindingView.btnAlipay.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.btn_tagcloud: + startActivity(new Intent(CustomizeHolder.this, TagCloudActivity.class)); + break; + case R.id.btn_combination: + startActivity(new Intent(CustomizeHolder.this, ClassificationActivity.class)); + break; + case R.id.btn_alipay: + startActivity(new Intent(CustomizeHolder.this, ClassificationAdapterActivity.class)); + break; + case R.id.btn_recttextview: + startActivity(new Intent(CustomizeHolder.this, PlayTextView.class)); + break; + case R.id.btn_view: + startActivity(new Intent(CustomizeHolder.this, PlayMusic.class)); + break; + case R.id.btn_xml_shape: + startActivity(new Intent(CustomizeHolder.this, PlayShape.class)); + break; + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/holder/DesignPatternHolder.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/holder/DesignPatternHolder.java new file mode 100644 index 0000000..208bf92 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/holder/DesignPatternHolder.java @@ -0,0 +1,36 @@ +package com.coder.guoy.recyclerview.ui.holder; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityDesignPatternHolderBinding; +import com.coder.guoy.recyclerview.designpattern.StrategyDesign; +/** + * @Version: + * @Author: + * @CreateTime:2017年6月1日 + * @Descrpiton: + */ +public class DesignPatternHolder extends MvvmBaseActivity implements View.OnClickListener { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_design_pattern_holder); + showContentView(); + setTitle("Design Pattern|设计模式"); + bindingView.btnStragegy.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.btn_stragegy: + startActivity(new Intent(DesignPatternHolder.this, StrategyDesign.class)); + break; + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/holder/MaterialDesignHolder.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/holder/MaterialDesignHolder.java new file mode 100644 index 0000000..3e5c165 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/holder/MaterialDesignHolder.java @@ -0,0 +1,114 @@ +package com.coder.guoy.recyclerview.ui.holder; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityMaterialDesignHolderBinding; +import com.coder.guoy.recyclerview.ui.PlayActivityTransitions; +import com.coder.guoy.recyclerview.ui.PlayAnimateVectorDrawables; +import com.coder.guoy.recyclerview.ui.PlayCurvedMotion; +import com.coder.guoy.recyclerview.ui.PlayFloatingActionButton; +import com.coder.guoy.recyclerview.ui.PlayRevealEffect; +import com.coder.guoy.recyclerview.ui.PlayStatusBar; +import com.coder.guoy.recyclerview.ui.PlayTextInputLayout; +import com.coder.guoy.recyclerview.ui.PlayTouchFeedback; +import com.coder.guoy.recyclerview.ui.PlayViewStateChange; +import com.coder.guoy.recyclerview.ui.animation.DrawableAnimation; +import com.coder.guoy.recyclerview.ui.animation.PropertyAnimation; +import com.coder.guoy.recyclerview.ui.animation.ViewAnimation; +import com.coder.guoy.recyclerview.ui.bottomsheet.PlayBottomSheetDialog; +import com.coder.guoy.recyclerview.ui.coordinator.PlayCoordinatorBehavior; +import com.coder.guoy.recyclerview.ui.coordinator.PlayCoordinatorLayout; +import com.coder.guoy.recyclerview.ui.coordinator.PlayCoordinatorToolbar; +import com.coder.guoy.recyclerview.ui.tablayout.PlayTabLayout; + +/** + * @Version: + * @Author: + * @CreateTime:2017年5月11日 + * @Descrpiton: + */ +public class MaterialDesignHolder extends MvvmBaseActivity implements View.OnClickListener { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_material_design_holder); + showContentView(); + setTitle("Material Design"); + bindingView.button5.setOnClickListener(this); + bindingView.button6.setOnClickListener(this); + bindingView.button7.setOnClickListener(this); + bindingView.button8.setOnClickListener(this); + bindingView.button9.setOnClickListener(this); + bindingView.button10.setOnClickListener(this); + bindingView.button11.setOnClickListener(this); + bindingView.buttonBsd.setOnClickListener(this); + bindingView.btnFeedfack.setOnClickListener(this); + bindingView.btnReveal.setOnClickListener(this); + bindingView.btnCurved.setOnClickListener(this); + bindingView.btnViewstate.setOnClickListener(this); + bindingView.btnActivitytransition.setOnClickListener(this); + bindingView.btnVectordrawable.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.button5: + startActivity(new Intent(MaterialDesignHolder.this, PlayCoordinatorToolbar.class)); + break; + case R.id.button6: + startActivity(new Intent(MaterialDesignHolder.this, PlayStatusBar.class)); + break; + case R.id.button7: + startActivity(new Intent(MaterialDesignHolder.this, PlayTabLayout.class)); + break; + case R.id.button8: + startActivity(new Intent(MaterialDesignHolder.this, PlayTextInputLayout.class)); + break; + case R.id.button9: + startActivity(new Intent(MaterialDesignHolder.this, PlayFloatingActionButton.class)); + break; + case R.id.button10: + startActivity(new Intent(MaterialDesignHolder.this, PlayCoordinatorLayout.class)); + break; + case R.id.button11: + startActivity(new Intent(MaterialDesignHolder.this, PlayCoordinatorBehavior.class)); + break; + case R.id.button12: + startActivity(new Intent(MaterialDesignHolder.this, DrawableAnimation.class)); + break; + case R.id.button13: + startActivity(new Intent(MaterialDesignHolder.this, ViewAnimation.class)); + break; + case R.id.button14: + startActivity(new Intent(MaterialDesignHolder.this, PropertyAnimation.class)); + break; + case R.id.button_bsd: + startActivity(new Intent(MaterialDesignHolder.this, PlayBottomSheetDialog.class)); + break; + case R.id.btn_feedfack: + startActivity(new Intent(MaterialDesignHolder.this, PlayTouchFeedback.class)); + break; + case R.id.btn_reveal: + startActivity(new Intent(MaterialDesignHolder.this, PlayRevealEffect.class)); + break; + case R.id.btn_curved: + startActivity(new Intent(MaterialDesignHolder.this, PlayCurvedMotion.class)); + break; + case R.id.btn_viewstate: + startActivity(new Intent(MaterialDesignHolder.this, PlayViewStateChange.class)); + break; + case R.id.btn_activitytransition: + startActivity(new Intent(MaterialDesignHolder.this, PlayActivityTransitions.class)); + break; + case R.id.btn_vectordrawable: + startActivity(new Intent(MaterialDesignHolder.this, PlayAnimateVectorDrawables.class)); + break; + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/holder/RecyclerViewHolder.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/holder/RecyclerViewHolder.java new file mode 100644 index 0000000..221375d --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/holder/RecyclerViewHolder.java @@ -0,0 +1,50 @@ +package com.coder.guoy.recyclerview.ui.holder; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityRecyclerViewHolderBinding; +import com.coder.guoy.recyclerview.ui.recyclerview.SampleActivity; +import com.coder.guoy.recyclerview.ui.recyclerview.WelfareActivity; +import com.coder.guoy.recyclerview.ui.recyclerview.WelfareAnimationActivity; + +/** + * @Version: + * @Author: + * @CreateTime:2017年5月11日 + * @Descrpiton: + */ +public class RecyclerViewHolder extends MvvmBaseActivity implements View.OnClickListener { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_recycler_view_holder); + showContentView(); + setTitle("RecyclerView"); + bindingView.button1.setOnClickListener(this); + bindingView.button2.setOnClickListener(this); + bindingView.button3.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + switch (v.getId()){ + case R.id.toolbar_back: + finish(); + break; + case R.id.button1: + startActivity(new Intent(RecyclerViewHolder.this, SampleActivity.class)); + break; + case R.id.button2: + startActivity(new Intent(RecyclerViewHolder.this, WelfareActivity.class)); + break; + case R.id.button3: + startActivity(new Intent(RecyclerViewHolder.this, WelfareAnimationActivity.class)); + break; + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/recyclerview/SampleActivity.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/recyclerview/SampleActivity.java new file mode 100644 index 0000000..1fc2fec --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/recyclerview/SampleActivity.java @@ -0,0 +1,158 @@ +package com.coder.guoy.recyclerview.ui.recyclerview; + +import android.graphics.drawable.AnimationDrawable; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.support.v4.widget.SwipeRefreshLayout; +import android.support.v7.widget.DefaultItemAnimator; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.View; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivitySampleBinding; + +import java.util.ArrayList; +import java.util.List; +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年4月17日 + * @Descrpiton:RecyclerView实现下拉刷新,上拉加载 + */ +public class SampleActivity extends MvvmBaseActivity { + + private List mList = new ArrayList(); + private LinearLayoutManager mLayoutManager; + private SampleAdapter adapter; + //页面可见的最后一个条目 + private int lastVisibleItem = 0; + private Handler mHandler = new Handler(Looper.getMainLooper()); + //每次加载条目的数量 + private static int PAGE_COUNT = 10; + private AnimationDrawable animation; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_sample); + showContentView(); + setToolbarVisible(View.GONE); + initView(); + initNetData(); + initRecyclerView(); + initRefreshLayout(); + } + + private void initView() { + animation = (AnimationDrawable) bindingView.imageviewSample.getDrawable(); + if (!animation.isRunning()) { + animation.start(); + } + } + + /** + * 获取数据 + */ + private void initNetData() { + for (int i = 0; i < 40; i++) { + mList.add("Recycler条目:" + i); + } + } + + /** + * 初始化RecyclerView + */ + private void initRecyclerView() { + // 初始化RecyclerView的Adapter + // 第一个参数为Context + // 第二个参数为数据,上拉加载的原理就是分页,所以我设置常量PAGE_COUNT=10,即每次加载10个数据 + // 第三个参数为hasMore,是否有新数据 + adapter = new SampleAdapter(this, getDatas(0, PAGE_COUNT), getDatas(0, PAGE_COUNT).size() > 0 ? true : false); + mLayoutManager = new LinearLayoutManager(getApplicationContext()); + bindingView.recyclerview.setLayoutManager(mLayoutManager); + bindingView.recyclerview.setAdapter(adapter); + //设置Item增加、移除动画 + bindingView.recyclerview.setItemAnimator(new DefaultItemAnimator()); + // 实现上拉加载重要步骤,设置滑动监听器,RecyclerView自带的ScrollListener + bindingView.recyclerview.setOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + // 在滑动完成后,拿到最后一个可见的item的位置 + lastVisibleItem = mLayoutManager.findLastVisibleItemPosition(); + } + + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + // 在newState为滑到底部时 + Log.i("newState", newState + ""); + if (newState == RecyclerView.SCROLL_STATE_IDLE) { + Log.i("newState", newState + "进入后"); + // 如果没有隐藏footView,那么最后一个条就比我们的getItemCount少1 + if (adapter.isFadeTips() == false && lastVisibleItem + 1 == adapter.getItemCount()) { + //更新获取数据 + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + updateRecyclerView(adapter.getRealLastPosition(), adapter.getRealLastPosition() + PAGE_COUNT); + } + }, 500); + } + } + } + }); + } + + + /** + * 初始化下拉刷新 + */ + private void initRefreshLayout() { + bindingView.refreshlayout.setColorSchemeResources(android.R.color.holo_blue_light, + android.R.color.holo_red_light, android.R.color.holo_orange_light, + android.R.color.holo_green_light); + bindingView.refreshlayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + bindingView.refreshlayout.setRefreshing(true); + adapter.resetDatas(); + updateRecyclerView(0, PAGE_COUNT); + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + bindingView.refreshlayout.setRefreshing(false); + } + }, 1000); + } + }); + } + + // 上拉加载时调用的更新RecyclerView的方法 + private void updateRecyclerView(int fromIndex, int toIndex) { + // 获取从fromIndex到toIndex的数据 + List newDatas = getDatas(fromIndex, toIndex); + if (newDatas.size() > 0) { + // 然后传给Adapter,并设置hasMore为true + adapter.updateList(newDatas, true); + } else { + adapter.updateList(null, false); + } + } + + //获取集合内制定范围的集合 + private List getDatas(final int firstIndex, final int lastIndex) { + List resList = new ArrayList<>(); + for (int i = firstIndex; i < lastIndex; i++) { + if (i < mList.size()) { + resList.add(mList.get(i)); + } + } + return resList; + } + +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/recyclerview/SampleAdapter.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/recyclerview/SampleAdapter.java new file mode 100644 index 0000000..e68ea5c --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/recyclerview/SampleAdapter.java @@ -0,0 +1,162 @@ +package com.coder.guoy.recyclerview.ui.recyclerview; + +import android.content.Context; +import android.databinding.DataBindingUtil; +import android.graphics.drawable.AnimationDrawable; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.databinding.ItemSampleBinding; +import com.coder.guoy.recyclerview.databinding.ItemWelfareFooterBinding; +import com.coder.guoy.recyclerview.utils.ToastUtil; + +import java.util.ArrayList; +import java.util.List; + + +public class SampleAdapter extends RecyclerView.Adapter { + private List mList; + private LayoutInflater mInflater; + private Context mContext; + private ItemSampleBinding normalBinding; + private ItemWelfareFooterBinding footBinding; + + private AnimationDrawable animationDrawable; + + private int normalType = 0; // 第一种ViewType,正常的item + private int footType = 1; // 第二种ViewType,底部的提示View + + private boolean hasMore = true; // 变量,是否有更多数据 + private boolean fadeTips = false; // 变量,是否隐藏了底部的提示 + + public SampleAdapter(Context context, List list, boolean hasMore) { + mInflater = LayoutInflater.from(context); + mList = list; + mContext = context; + this.hasMore = hasMore; + } + + // 获取条目数量,之所以要加1是因为增加了一条footView + @Override + public int getItemCount() { + return mList.size() + 1; + } + + // 自定义方法,获取列表中数据源的最后一个位置,比getItemCount少1,因为不计上footView + public int getRealLastPosition() { + return mList.size(); + } + + // 根据条目位置返回ViewType,以供onCreateViewHolder方法内获取不同的Holder + @Override + public int getItemViewType(int position) { + if (position == getItemCount() - 1) { + return footType; + } else { + return normalType; + } + } + + // 正常item的ViewHolder + private class NormalViewHolder extends RecyclerView.ViewHolder { + public TextView textView; + + public NormalViewHolder(View itemView) { + super(itemView); + textView = normalBinding.itemTextview; + } + } + + // 底部footView的ViewHolder + private class FootViewHolder extends RecyclerView.ViewHolder { + public TextView footText; + public LinearLayout footLayout; + public ImageView image; + + public FootViewHolder(View itemView) { + super(itemView); + footText = footBinding.itemTextview; + footLayout = footBinding.layoutFoot; + image = footBinding.imgProgress; + } + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + if (viewType == normalType) { + normalBinding = DataBindingUtil.inflate(mInflater, R.layout.item_sample, parent, false); + return new NormalViewHolder(normalBinding.getRoot()); + } else { + footBinding = DataBindingUtil.inflate(mInflater, R.layout.item_welfare_footer, parent, false); + return new FootViewHolder(footBinding.getRoot()); + } + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { + // 如果是正常的imte,直接设置TextView的值 + if (holder instanceof NormalViewHolder) { + NormalViewHolder vh = (NormalViewHolder) holder; + vh.textView.setText(mList.get(position)); + } else { + final FootViewHolder vh = (FootViewHolder) holder; + // 只有获取数据为空时,hasMore为false,所以当我们拉到底部时基本都会首先显示“正在加载更多...” + if (hasMore) { // 不隐藏footView提示 + fadeTips = false; + if (mList != null && !mList.isEmpty()) {// 如果查询数据发现增加之后,就显示正在加载更多 + vh.footLayout.setVisibility(View.VISIBLE); + vh.footText.setText("正在加载更多..."); + vh.image.setVisibility(View.VISIBLE);//显示加载动画 + animationDrawable = (AnimationDrawable) vh.image.getDrawable(); + animationDrawable.start(); + }else { + vh.footLayout.setVisibility(View.GONE); + animationDrawable.stop(); + ToastUtil.show("服务器暂未提供相关数据"); + fadeTips = true; + hasMore = false; + } + if (mList != null && !mList.isEmpty() && mList.size() < 10) { //数据不足以显示整个页面,隐藏footView + vh.footLayout.setVisibility(View.VISIBLE); + vh.footText.setText("没有更多数据了"); //显示没有更多数据了 + vh.image.setVisibility(View.GONE);//隐藏加载动画 + fadeTips = true; + } + } else {// 如果查询数据发现并没有增加时,就显示没有更多数据了 + vh.footLayout.setVisibility(View.VISIBLE); + vh.footText.setText("没有更多数据了"); + vh.image.setVisibility(View.GONE); //隐藏加载动画 + fadeTips = true; + hasMore = true; // hasMore设为true是为了让再次拉到底时,会先显示正在加载更多 + } + } + } + + // 暴露接口,改变fadeTips的方法 + public boolean isFadeTips() { + return fadeTips; + } + + // 暴露接口,下拉刷新时,通过暴露方法将数据源置为空 + public void resetDatas() { + mList = new ArrayList<>(); + } + + // 暴露接口,更新数据源,并修改hasMore的值,如果有增加数据,hasMore为true,否则为false + public void updateList(List list, boolean hasMore) { + // 在原有的数据之上增加新数据 + if (list != null) { + mList.addAll(list); + } + this.hasMore = hasMore; + notifyDataSetChanged(); + } + +} + diff --git a/app/src/main/java/com/coder/guoy/recyclerview/MainActivity.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/recyclerview/WelfareActivity.java similarity index 90% rename from app/src/main/java/com/coder/guoy/recyclerview/MainActivity.java rename to app/src/main/java/com/coder/guoy/recyclerview/ui/recyclerview/WelfareActivity.java index 3af042e..e39959a 100644 --- a/app/src/main/java/com/coder/guoy/recyclerview/MainActivity.java +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/recyclerview/WelfareActivity.java @@ -1,4 +1,4 @@ -package com.coder.guoy.recyclerview; +package com.coder.guoy.recyclerview.ui.recyclerview; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; @@ -8,12 +8,14 @@ import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; -import android.util.Log; +import android.view.View; +import com.coder.guoy.recyclerview.Constants; +import com.coder.guoy.recyclerview.R; import com.coder.guoy.recyclerview.api.ApiHelper; import com.coder.guoy.recyclerview.api.bean.GankIoDataBean; import com.coder.guoy.recyclerview.base.MvvmBaseActivity; -import com.coder.guoy.recyclerview.databinding.ActivityMainBinding; +import com.coder.guoy.recyclerview.databinding.ActivityWelfareBinding; import java.util.ArrayList; import java.util.List; @@ -23,14 +25,14 @@ /** * @Version:v1.0 * @Author:Guoy - * @CreateTime:2017年4月14日 - * @Descrpiton:RecycleView下拉刷新,上拉加载更多 + * @CreateTime:2017年4月18日 + * @Descrpiton:RecyclerView+Glide加载图片 */ -public class MainActivity extends MvvmBaseActivity { +public class WelfareActivity extends MvvmBaseActivity { private List mList = new ArrayList(); private GridLayoutManager mLayoutManager; - private RecyclerViewAdapter adapter; + private WelfareAdapter adapter; //页面可见的最后一个条目 private int lastVisibleItem = 0; private Handler mHandler = new Handler(Looper.getMainLooper()); @@ -43,11 +45,19 @@ public class MainActivity extends MvvmBaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); + setContentView(R.layout.activity_welfare); + setToolbarVisible(View.GONE); initView(); initNetData(); } + private void initView() { + animation = (AnimationDrawable) bindingView.imageview.getDrawable(); + if (!animation.isRunning()) { + animation.start(); + } + } + /** * 首次获取网络数据 */ @@ -74,13 +84,6 @@ public void onError(Throwable e) { }); } - private void initView() { - animation = (AnimationDrawable) bindingView.imageview.getDrawable(); - if (!animation.isRunning()) { - animation.start(); - } - } - /** * 初始化下拉刷新 */ @@ -112,7 +115,7 @@ private void initRecyclerView() { // 第一个参数为Context // 第二个参数为数据,上拉加载的原理就是分页,所以我设置常量PAGE_COUNT=10,即每次加载10个数据 // 第三个参数为hasMore,是否有新数据 - adapter = new RecyclerViewAdapter(this, mList, mList.size() > 0 ? true : false); + adapter = new WelfareAdapter(this, mList, mList.size() > 0 ? true : false); mLayoutManager = new GridLayoutManager(getApplicationContext(), 2); bindingView.recyclerview.setLayoutManager(mLayoutManager); bindingView.recyclerview.setAdapter(adapter); @@ -144,6 +147,7 @@ public void onScrollStateChanged(RecyclerView recyclerView, int newState) { /** * 获取网络数据 + * * @param page 请求的页码 */ private void getNetData(int page) { @@ -153,12 +157,10 @@ private void getNetData(int page) { public void onNext(GankIoDataBean bean) { bindingView.setGankIoDataBean(bean); mList = bean.getResults(); - Log.i("main", "加载更多" + mList.size()); } @Override public void onCompleted() { - Log.i("main", "onCompleted加载更多完成"); //然后调用updateRecyclerview方法更新RecyclerView updateRecyclerView(); showContentView(); @@ -167,7 +169,6 @@ public void onCompleted() { @Override public void onError(Throwable e) { showError(); - Log.i("main", "加载更多" + e.toString()); } }); } diff --git a/app/src/main/java/com/coder/guoy/recyclerview/RecyclerViewAdapter.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/recyclerview/WelfareAdapter.java similarity index 87% rename from app/src/main/java/com/coder/guoy/recyclerview/RecyclerViewAdapter.java rename to app/src/main/java/com/coder/guoy/recyclerview/ui/recyclerview/WelfareAdapter.java index f298cb4..45b81d5 100644 --- a/app/src/main/java/com/coder/guoy/recyclerview/RecyclerViewAdapter.java +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/recyclerview/WelfareAdapter.java @@ -1,10 +1,8 @@ -package com.coder.guoy.recyclerview; +package com.coder.guoy.recyclerview.ui.recyclerview; import android.content.Context; import android.databinding.DataBindingUtil; import android.graphics.drawable.AnimationDrawable; -import android.os.Handler; -import android.os.Looper; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; @@ -14,9 +12,10 @@ import android.widget.TextView; import android.widget.Toast; +import com.coder.guoy.recyclerview.R; import com.coder.guoy.recyclerview.api.bean.GankIoDataBean; -import com.coder.guoy.recyclerview.databinding.ItemRecyclerTestBinding; -import com.coder.guoy.recyclerview.databinding.ItemRecyclerTestFooterBinding; +import com.coder.guoy.recyclerview.databinding.ItemWelfareBinding; +import com.coder.guoy.recyclerview.databinding.ItemWelfareFooterBinding; import com.coder.guoy.recyclerview.utils.DensityUtil; import com.coder.guoy.recyclerview.utils.GlideUtils; @@ -28,16 +27,13 @@ * @Author: * @CreateTime: * @Descrpiton:自定义加载更多 - * @UpDateAuthor: - * @UpDateTime: - * @UpDataWhat: */ -public class RecyclerViewAdapter extends RecyclerView.Adapter { +public class WelfareAdapter extends RecyclerView.Adapter { private List mList; private LayoutInflater mInflater; private Context mContext; - private ItemRecyclerTestBinding normalBinding; - private ItemRecyclerTestFooterBinding footBinding; + private ItemWelfareBinding normalBinding; + private ItemWelfareFooterBinding footBinding; private AnimationDrawable animationDrawable; @@ -47,9 +43,7 @@ public class RecyclerViewAdapter extends RecyclerView.Adapter { private boolean hasMore = true; // 变量,是否有更多数据 private boolean fadeTips = false; // 变量,是否隐藏了底部的提示 - private Handler mHandler = new Handler(Looper.getMainLooper()); //获取主线程的Handler - - public RecyclerViewAdapter(Context context, List list, boolean hasMore) { + public WelfareAdapter(Context context, List list, boolean hasMore) { mInflater = LayoutInflater.from(context); mList = list; mContext = context; @@ -62,11 +56,6 @@ public int getItemCount() { return mList.size() + 1; } - // 自定义方法,获取列表中数据源的最后一个位置,比getItemCount少1,因为不计上footView - public int getRealLastPosition() { - return mList.size(); - } - // 根据条目位置返回ViewType,以供onCreateViewHolder方法内获取不同的Holder @Override public int getItemViewType(int position) { @@ -104,10 +93,10 @@ public FootViewHolder(View itemView) { @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == normalType) { - normalBinding = DataBindingUtil.inflate(mInflater, R.layout.item_recycler_test, parent, false); + normalBinding = DataBindingUtil.inflate(mInflater, R.layout.item_welfare, parent, false); return new NormalViewHolder(normalBinding.getRoot()); } else { - footBinding = DataBindingUtil.inflate(mInflater, R.layout.item_recycler_test_footer, parent, false); + footBinding = DataBindingUtil.inflate(mInflater, R.layout.item_welfare_footer, parent, false); return new FootViewHolder(footBinding.getRoot()); } } @@ -117,6 +106,7 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) // 如果是正常的imte,直接设置TextView的值 if (holder instanceof NormalViewHolder) { NormalViewHolder vh = (NormalViewHolder) holder; + //设置图片的边距 if (position % 2 == 0) { DensityUtil.setViewMargin(vh.imageView, false, 12, 6, 12, 0); } else { diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/recyclerview/WelfareAnimationActivity.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/recyclerview/WelfareAnimationActivity.java new file mode 100644 index 0000000..7c599c8 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/recyclerview/WelfareAnimationActivity.java @@ -0,0 +1,107 @@ +package com.coder.guoy.recyclerview.ui.recyclerview; + +import android.graphics.drawable.AnimationDrawable; +import android.os.Bundle; +import android.support.v7.widget.DefaultItemAnimator; +import android.support.v7.widget.GridLayoutManager; +import android.view.View; + +import com.coder.guoy.recyclerview.Constants; +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.api.ApiHelper; +import com.coder.guoy.recyclerview.api.bean.GankIoDataBean; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityWelfareBinding; + +import java.util.ArrayList; +import java.util.List; + +import rx.Subscriber; + +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年4月19日 + * @Descrpiton:RecyclerView给Item添加滑动时动画 + */ +public class WelfareAnimationActivity extends MvvmBaseActivity { + + private List mList = new ArrayList(); + private GridLayoutManager mLayoutManager; + private WelfareAnimationAdapter adapter; + //每次加载条目的数量 + private static int PAGE_COUNT = 40; + //请求起始页 + private int PAGE = 1; + private AnimationDrawable animation; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_welfare); + setToolbarVisible(View.GONE); + bindingView.refreshlayout.setEnabled(false); + initView(); + initNetData(); + } + + private void initView() { + animation = (AnimationDrawable) bindingView.imageview.getDrawable(); + if (!animation.isRunning()) { + animation.start(); + } + } + + /** + * 获取网络数据 + */ + private void initNetData() { + ApiHelper.getInstance(Constants.GANK_URL).getGankIoDataBean(Constants.FULI, PAGE_COUNT, PAGE) + .subscribe(new Subscriber() { + @Override + public void onNext(GankIoDataBean bean) { + bindingView.setGankIoDataBean(bean); + mList = bean.getResults(); + } + + @Override + public void onCompleted() { + initRecyclerView(); + showContentView(); + } + + @Override + public void onError(Throwable e) { + showError(); + } + }); + } + + /** + * 初始化RecyclerView + */ + private void initRecyclerView() { + // 初始化RecyclerView的Adapter + // 第一个参数为Context + // 第二个参数为数据,上拉加载的原理就是分页,所以我设置常量PAGE_COUNT=10,即每次加载10个数据 + adapter = new WelfareAnimationAdapter(this, mList); + mLayoutManager = new GridLayoutManager(getApplicationContext(), 2); + bindingView.recyclerview.setLayoutManager(mLayoutManager); + bindingView.recyclerview.setAdapter(adapter); + //设置Item增加、移除动画 + bindingView.recyclerview.setItemAnimator(new DefaultItemAnimator()); + } + + @Override + public void onRefresh() { + initNetData(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (animation.isRunning()) { + animation.stop(); + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/recyclerview/WelfareAnimationAdapter.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/recyclerview/WelfareAnimationAdapter.java new file mode 100644 index 0000000..164cf77 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/recyclerview/WelfareAnimationAdapter.java @@ -0,0 +1,83 @@ +package com.coder.guoy.recyclerview.ui.recyclerview; + +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.content.Context; +import android.databinding.DataBindingUtil; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.api.bean.GankIoDataBean; +import com.coder.guoy.recyclerview.databinding.ItemWelfareBinding; +import com.coder.guoy.recyclerview.utils.DensityUtil; +import com.coder.guoy.recyclerview.utils.GlideUtils; + +import java.util.List; + +/** + * @Version: + * @Author: + * @CreateTime: + * @Descrpiton: + */ +public class WelfareAnimationAdapter extends RecyclerView.Adapter { + private List mList; + private LayoutInflater mInflater; + private Context mContext; + private ItemWelfareBinding normalBinding; + + public WelfareAnimationAdapter(Context context, List list) { + mInflater = LayoutInflater.from(context); + mList = list; + mContext = context; + } + + // 获取条目数量 + @Override + public int getItemCount() { + return mList.size() ; + } + + private class NormalViewHolder extends RecyclerView.ViewHolder { + public ImageView imageView; + + public NormalViewHolder(View itemView) { + super(itemView); + imageView = normalBinding.itemImage; + } + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + normalBinding = DataBindingUtil.inflate(mInflater, R.layout.item_welfare, parent, false); + return new NormalViewHolder(normalBinding.getRoot()); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { + NormalViewHolder vh = (NormalViewHolder) holder; + GlideUtils.setImage(mContext, mList.get(position).getUrl(), vh.imageView); + //设置图片的边距 + if (position % 2 == 0) { + DensityUtil.setViewMargin(vh.imageView, false, 12, 6, 12, 0); + } else { + DensityUtil.setViewMargin(vh.imageView, false, 6, 12, 12, 0); + } + //添加动画属性 + setAnimator(vh); + } + + public void setAnimator(NormalViewHolder vh) { + ObjectAnimator scaleY = ObjectAnimator.ofFloat(vh.imageView, "scaleY", 0.8f, 1f).setDuration(500); + ObjectAnimator scaleX = ObjectAnimator.ofFloat(vh.imageView, "scaleX", 0.8f, 1f).setDuration(500); + AnimatorSet animSet = new AnimatorSet(); + animSet.play(scaleX).with(scaleY); + animSet.setDuration(500); + animSet.start(); + } + +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/tablayout/MyFragmentPagerAdapter.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/tablayout/MyFragmentPagerAdapter.java new file mode 100644 index 0000000..54cb72e --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/tablayout/MyFragmentPagerAdapter.java @@ -0,0 +1,38 @@ +package com.coder.guoy.recyclerview.ui.tablayout; + +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; + +import java.util.List; + +/** + * @Version: + * @Author: + * @CreateTime: + * @Descrpiton: + */ +public class MyFragmentPagerAdapter extends FragmentPagerAdapter { + + private List mList; + + public MyFragmentPagerAdapter(FragmentManager fm, List list) { + super(fm); + this.mList = list; + } + + @Override + public Fragment getItem(int position) { + return new PageFragment(); + } + + @Override + public int getCount() { + return mList.size(); + } + + @Override + public CharSequence getPageTitle(int position) { + return mList.get(position); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/tablayout/PageFragment.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/tablayout/PageFragment.java new file mode 100644 index 0000000..86724e6 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/tablayout/PageFragment.java @@ -0,0 +1,26 @@ +package com.coder.guoy.recyclerview.ui.tablayout; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.coder.guoy.recyclerview.R; + +/** + * @Version: + * @Author: + * @CreateTime: + * @Descrpiton: + */ +public class PageFragment extends Fragment { + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_page, container, false); + return view; + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/tablayout/PlayTabLayout.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/tablayout/PlayTabLayout.java new file mode 100644 index 0000000..de0bbd5 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/tablayout/PlayTabLayout.java @@ -0,0 +1,42 @@ +package com.coder.guoy.recyclerview.ui.tablayout; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.View; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityTabLayoutBinding; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年4月26日 + * @Descrpiton:TabLayout|横向标签布局 + */ +public class PlayTabLayout extends MvvmBaseActivity implements View.OnClickListener { + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_tab_layout); + showContentView(); + setTitle("TabLayout"); + List mList = new ArrayList(); + for (int i = 1; i <= 8; i++) { + mList.add("Tab" + i); + } + //给viewpager设置adapter + bindingView.viewpager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager(), mList)); + //setupWithViewPagerb必须在viewpager之后 + bindingView.tablayout.setupWithViewPager(bindingView.viewpager); + } + + @Override + public void onClick(View v) { + finish(); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/tagcloud/TagCloudActivity.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/tagcloud/TagCloudActivity.java new file mode 100644 index 0000000..1db31ef --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/tagcloud/TagCloudActivity.java @@ -0,0 +1,27 @@ +package com.coder.guoy.recyclerview.ui.tagcloud; + +import android.os.Bundle; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.base.MvvmBaseActivity; +import com.coder.guoy.recyclerview.databinding.ActivityTagCloudBinding; +import com.coder.guoy.recyclerview.utils.CommonUtils; +/** + * @Version:v1.0 + * @Author:Guoy + * @CreateTime:2017年4月20日 + * @Descrpiton:3D球,自定义继承viewgroup实现 + */ +public class TagCloudActivity extends MvvmBaseActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_tag_cloud); + showContentView(); + setTitle("3D球"); + bindingView.tagCloud.setBackgroundColor(CommonUtils.getColor(R.color.colorTheme)); + TagCloudAdapter adapter = new TagCloudAdapter(new String[100]); + bindingView.tagCloud.setAdapter(adapter); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/ui/tagcloud/TagCloudAdapter.java b/app/src/main/java/com/coder/guoy/recyclerview/ui/tagcloud/TagCloudAdapter.java new file mode 100644 index 0000000..11dca11 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/ui/tagcloud/TagCloudAdapter.java @@ -0,0 +1,62 @@ +package com.coder.guoy.recyclerview.ui.tagcloud; + +import android.content.Context; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.coder.guoy.recyclerview.view.tagcloud.TagsAdapter; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * @Version: + * @Author: + * @CreateTime: + * @Descrpiton: + */ +public class TagCloudAdapter extends TagsAdapter { + private List mList = new ArrayList(); + + public TagCloudAdapter(String[] list) { + mList.clear(); + Collections.addAll(mList, list); + } + + //返回Tag数量 + @Override + public int getCount() { + return mList.size(); + } + + //返回每个Tag实例 + @Override + public Object getItem(int position) { + return mList.get(position); + } + + @Override + public View getView(Context context, int position, ViewGroup parent) { + TextView tv = new TextView(context); + ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(100, 100); + tv.setLayoutParams(lp); + tv.setText("No." + position); + tv.setGravity(Gravity.CENTER); + return tv; + } + + //返回Tag数据 + @Override + public int getPopularity(int position) { + return position % 7; + } + + //针对每个Tag返回一个权重值,该值与ThemeColor和Tag初始大小有关 + @Override + public void onThemeColorChanged(View view, int themeColor) { + ((TextView)view).setTextColor(themeColor); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/utils/GlideUtils.java b/app/src/main/java/com/coder/guoy/recyclerview/utils/GlideUtils.java index dc31d1d..cfb87aa 100644 --- a/app/src/main/java/com/coder/guoy/recyclerview/utils/GlideUtils.java +++ b/app/src/main/java/com/coder/guoy/recyclerview/utils/GlideUtils.java @@ -19,15 +19,9 @@ public class GlideUtils { public static void setImage(Context context, String url, ImageView imageview) { Glide.with(context).load(url) - .placeholder(R.drawable.loading) //加载中显示的图片 - .fallback(R.drawable.loading) //默认图片 .error(R.drawable.loadingfaile) //加载失败显示的图片 .crossFade() //渐显动画 .centerCrop() .into(imageview); - - } - - } diff --git a/app/src/main/java/com/coder/guoy/recyclerview/utils/TimeUtil.java b/app/src/main/java/com/coder/guoy/recyclerview/utils/TimeUtil.java new file mode 100644 index 0000000..dc5da3d --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/utils/TimeUtil.java @@ -0,0 +1,418 @@ +package com.coder.guoy.recyclerview.utils; + +import android.text.format.Time; +import android.util.Log; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; + +/** + * 一个友好的时间显示工具类,类似于朋友圈 + */ + +public class TimeUtil { + + /** + * 准备第一个模板,从字符串中提取出日期数字 + */ + private static String pat1 = "yyyy-MM-dd HH:mm:ss"; + /** + * 准备第二个模板,将提取后的日期数字变为指定的格式 + */ + private static String pat2 = "yyyy年MM月dd日 HH:mm:ss"; + /** + * 实例化模板对象 + */ + private static SimpleDateFormat sdf1 = new SimpleDateFormat(pat1); + private static SimpleDateFormat sdf2 = new SimpleDateFormat(pat2); + private static long timeMilliseconds; + + public static Long farmatTime(String string) { + Date date = null; + try { + SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + date = Date(sf.parse(string)); + } catch (ParseException e) { + e.printStackTrace(); + } + return date.getTime(); + } + + public static Date Date(Date date) { + Date datetimeDate; + datetimeDate = new Date(date.getTime()); + return datetimeDate; + } + + public static Date Dates() { + Date datetimeDate; + Long dates = 1361515285070L; + datetimeDate = new Date(dates); + return datetimeDate; + } + + public static String getTime(String commitDate) { + // 在主页面中设置当天时间 + Date nowTime = new Date(); + String currDate = sdf1.format(nowTime); + Date date = null; + try { + if (commitDate.length() > 19) { + commitDate = commitDate.substring(0, 18); + } + if (commitDate.length() == 16) { + StringBuffer buffer = new StringBuffer(commitDate); + buffer.append(":00"); + commitDate = buffer.toString(); + } + // 将给定的字符串中的日期提取出来 + date = sdf1.parse(commitDate); + } catch (Exception e) { + e.printStackTrace(); + } + int nowDate = Integer.valueOf(currDate.substring(8, 10)); + int commit = Integer.valueOf(commitDate.substring(8, 10)); + + String monthDay = sdf2.format(date).substring(5, 12); + String yearMonthDay = sdf2.format(date).substring(0, 12); + int month = Integer.valueOf(monthDay.substring(0, 2)); + int day = Integer.valueOf(monthDay.substring(3, 5)); + if (month < 10 && day < 10) { + monthDay = monthDay.substring(1, 3) + monthDay.substring(4); + } else if (month < 10) { + monthDay = monthDay.substring(1); + } else if (day < 10) { + monthDay = monthDay.substring(0, 3) + monthDay.substring(4); + } + int yearMonth = Integer.valueOf(yearMonthDay.substring(5, 7)); + int yearDay = Integer.valueOf(yearMonthDay.substring(8, 10)); + if (yearMonth < 10 && yearDay < 10) { + yearMonthDay = yearMonthDay.substring(0, 5) + + yearMonthDay.substring(6, 8) + yearMonthDay.substring(9); + } else if (yearMonth < 10) { + yearMonthDay = yearMonthDay.substring(0, 5) + + yearMonthDay.substring(6); + } else if (yearDay < 10) { + yearMonthDay = yearMonthDay.substring(0, 8) + + yearMonthDay.substring(9); + } + String str = " 00:00:00"; + float currDay = farmatTime(currDate.substring(0, 10) + str); + float commitDay = farmatTime(commitDate.substring(0, 10) + str); + int currYear = Integer.valueOf(currDate.substring(0, 4)); + int commitYear = Integer.valueOf(commitDate.substring(0, 4)); + int flag = (int) (farmatTime(currDate) / 1000 - farmatTime(commitDate) / 1000); + String des = null; + String hourMin = commitDate.substring(11, 16); + int temp = flag; + if (temp < 60) { + System.out.println("A"); + if (commitDay < currDay) { + des = "昨天 " + hourMin; + } else { + des = "刚刚"; + } + } else if (temp < 60 * 60) { + System.out.println("B"); + if (commitDay < currDay) { + des = "昨天 " + hourMin; + } else { + des = temp / 60 + "分钟前"; + } + } else if (temp < 60 * 60 * 24) { + System.out.println("C"); + int hour = temp / (60 * 60); + if (commitDay < currDay) { + des = "昨天 " + hourMin; + } else { + if (hour < 6) { + des = hour + "小时前"; + } else { + des = hourMin; + } + } + } else if (temp < (60 * 60 * 24 * 2)) { + System.out.println("D"); + if (nowDate - commit == 1) { + des = "昨天 " + hourMin; + } else { + des = "前天 " + hourMin; + } + } else if (temp < 60 * 60 * 60 * 3) { + System.out.println("E"); + if (nowDate - commit == 2) { + des = "前天 " + hourMin; + } else { + if (commitYear < currYear) { + des = yearMonthDay + hourMin; + } else { + des = monthDay + hourMin; + } + } + } else { + System.out.println("F"); + if (commitYear < currYear) { + des = yearMonthDay + hourMin; + } else { + des = monthDay + hourMin; + } + } + if (des == null) { + des = commitDate; + } + return des; + } + + public static Date Date() { + Date datetimeDate; + Long dates = 1361514787384L; + datetimeDate = new Date(dates); + return datetimeDate; + } + + /** + * 如果在1分钟之内发布的显示"刚刚" 如果在1个小时之内发布的显示"XX分钟之前" 如果在1天之内发布的显示"XX小时之前" + * 如果在今年的1天之外的只显示“月-日”,例如“05-03” 如果不是今年的显示“年-月-日”,例如“2014-03-11” + * + * @param time + * @return + */ + public static String translateTime(String time) { + // 在主页面中设置当天时间 + Date nowTime = new Date(); + String currDate = sdf1.format(nowTime); + long currentMilliseconds = nowTime.getTime();// 当前日期的毫秒值 + Date date = null; + try { + // 将给定的字符串中的日期提取出来 + date = sdf1.parse(time); + } catch (Exception e) { + e.printStackTrace(); + return time; + } + if (date != null) { + timeMilliseconds = date.getTime(); + } + + long timeDifferent = currentMilliseconds - timeMilliseconds; + if (timeDifferent < 60000) {// 一分钟之内 + + return "刚刚"; + } + if (timeDifferent < 3600000) {// 一小时之内 + long longMinute = timeDifferent / 60000; + int minute = (int) (longMinute % 100); + return minute + "分钟之前"; + } + long l = 24 * 60 * 60 * 1000; // 每天的毫秒数 + if (timeDifferent < l) {// 小于一天 + long longHour = timeDifferent / 3600000; + int hour = (int) (longHour % 100); + return hour + "小时之前"; + } + if (timeDifferent >= l) { + String currYear = currDate.substring(0, 4); + String year = time.substring(0, 4); + if (!year.equals(currYear)) { + return time.substring(0, 10); + } + return time.substring(5, 10); + } + return time; + } + + + /** + * 如果在1分钟之内发布的显示"刚刚" 如果在1个小时之内发布的显示"XX分钟之前" 如果在1天之内发布的显示"XX小时之前" + * 如果在今年的1天之外的只显示“月-日”,例如“05-03” 如果不是今年的显示“年-月-日”,例如“2014-03-11” + * + * @param time + * @return + */ + public static String getTranslateTime(String time) { + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + // 在主页面中设置当天时间 + Date nowTime = new Date(); + String currDate = sdf1.format(nowTime); + long currentMilliseconds = nowTime.getTime();// 当前日期的毫秒值 + Date date = null; + try { + // 将给定的字符串中的日期提取出来 + date = sdf1.parse(time); + } catch (Exception e) { + e.printStackTrace(); + return time; + } + if (date != null) { + timeMilliseconds = date.getTime(); + } + + long timeDifferent = currentMilliseconds - timeMilliseconds; + + + if (timeDifferent < 60000) {// 一分钟之内 + + return "刚刚"; + } + if (timeDifferent < 3600000) {// 一小时之内 + long longMinute = timeDifferent / 60000; + int minute = (int) (longMinute % 100); + return minute + "分钟之前"; + } + long l = 24 * 60 * 60 * 1000; // 每天的毫秒数 + if (timeDifferent < l) {// 小于一天 + long longHour = timeDifferent / 3600000; + int hour = (int) (longHour % 100); + return hour + "小时之前"; + } + if (timeDifferent >= l) { + String currYear = currDate.substring(0, 4); + String year = time.substring(0, 4); + if (!year.equals(currYear)) { + return time.substring(0, 10); + } + return time.substring(5, 10); + } + return time; + } + + /** + * 获取当前日期 + */ + public static String getData() { + SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + String date = sDateFormat.format(new Date()); + return date; + } + + /** + * 获取当前时间是否大于12:30 + */ + public static boolean isRightTime() { + // or Time t=new Time("GMT+8"); 加上Time Zone资料。 + Time t = new Time(); + t.setToNow(); // 取得系统时间。 + int hour = t.hour; // 0-23 + int minute = t.minute; + return hour > 12 || (hour == 12 && minute >= 30); + } + + /** + * 得到上一天的时间 + */ + public static ArrayList getLastTime(String year, String month, String day) { + Calendar ca = Calendar.getInstance();//得到一个Calendar的实例 + ca.set(Integer.valueOf(year), Integer.valueOf(month) - 1, Integer.valueOf(day));//月份是从0开始的,所以11表示12月 + + //使用roll方法进行向前回滚 + //cl.roll(Calendar.DATE, -1); + //使用set方法直接进行设置 + int inDay = ca.get(Calendar.DATE); + ca.set(Calendar.DATE, inDay - 1); + + ArrayList list = new ArrayList<>(); + list.add(String.valueOf(ca.get(Calendar.YEAR))); + list.add(String.valueOf(ca.get(Calendar.MONTH) + 1)); + list.add(String.valueOf(ca.get(Calendar.DATE))); + return list; + } + + + public static Date getDate() { + SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + String date = sDateFormat.format(new Date()); + try { + return sDateFormat.parse(date); + } catch (ParseException e) { + } + return null; + } + + /** + * 比较日期与当前日期的大小 + */ + public static boolean DateCompare(String s1) throws ParseException { + //设定时间的模板 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + //得到指定模范的时间 + Date d1 = sdf.parse(s1); + Date d2 = sdf.parse(getData()); + //比较 + if (((d1.getTime() - d2.getTime()) / (24 * 3600 * 1000)) >= 1) { + return true; + } else { + return false; + } + } + + public static boolean DateCompare(String data1, String data2) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + //得到指定模范的时间 + Date d1 = null; + try { + d1 = sdf.parse(data1); + } catch (ParseException e) { + return false; + } + Date d2 = null; + try { + d2 = sdf.parse(data2); + } catch (ParseException e) { + return true; + } + //比较 + if (((d1.getTime() - d2.getTime()) / (24 * 3600 * 1000)) >= 1) { + return true; + } else { + return false; + } + } + + public static String timeFormat(String time) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + Date date = null; + try { + // 将给定的字符串中的日期提取出来 + date = sdf.parse(time); + } catch (Exception e) { + Log.e("--时间解析-->", "错误"); + return time; + } + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + return sdf1.format(date); + } + + + public static String timeFormatStr(String time) { + // + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + Date date = null; + try { + // 将给定的字符串中的日期提取出来 + date = sdf.parse(time); + } catch (Exception e) { + Log.e("--时间解析-->", "错误"); + return time; + } + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return sdf1.format(date); + } + + public static String timeFormatYYYYMMDD(String time) { + // + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + Date date = null; + try { + // 将给定的字符串中的日期提取出来 + date = sdf.parse(time); + } catch (Exception e) { + Log.e("--时间解析-->", "错误"); + return time; + } + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); + return sdf1.format(date); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/view/MusicProgress.java b/app/src/main/java/com/coder/guoy/recyclerview/view/MusicProgress.java new file mode 100644 index 0000000..327f6f1 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/view/MusicProgress.java @@ -0,0 +1,66 @@ +package com.coder.guoy.recyclerview.view; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.LinearGradient; +import android.graphics.Paint; +import android.graphics.Shader; +import android.support.annotation.Nullable; +import android.util.AttributeSet; +import android.view.View; + +/** + * @Version: + * @Author:Guoy + * @CreateTime:2017/6/5 + * @Descrpiton: + */ +public class MusicProgress extends View { + private double mRandom; + private Paint mPaint1; + private int mRectHeight;//矩形的高度 + private int mRectWidth = 100;//矩形的宽度 + private float mCurrentHeight; + private int offset = 5;//两个矩形之间的间距 + private LinearGradient mLinearGradient; + + public MusicProgress(Context context) { + super(context); + } + + public MusicProgress(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public MusicProgress(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + mPaint1 = new Paint(); + mRectHeight = getMeasuredHeight(); + for (int i = 0; i < 10; i++) { + mRandom = Math.random(); + mCurrentHeight = (float) (mRectHeight * mRandom); + //给每个矩形添加渐变渲染器 + mLinearGradient = new LinearGradient(0, 0, + (float) (mRectWidth * (i + 1)), + mRectHeight, Color.RED, Color.YELLOW, Shader.TileMode.MIRROR); + + mPaint1.setShader(mLinearGradient); + canvas.drawRect( + (float) (mRectWidth * i + offset), + mCurrentHeight, + (float) (mRectWidth * (i + 1)), + mRectHeight, + mPaint1 + ); + + } + postInvalidateDelayed(1000); + } + +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/view/alipay/Classification.java b/app/src/main/java/com/coder/guoy/recyclerview/view/alipay/Classification.java new file mode 100644 index 0000000..70cf9cb --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/view/alipay/Classification.java @@ -0,0 +1,178 @@ +package com.coder.guoy.recyclerview.view.alipay; + +import android.content.Context; +import android.databinding.DataBindingUtil; +import android.support.annotation.Nullable; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.coder.guoy.recyclerview.R; +import com.coder.guoy.recyclerview.databinding.ItemClassificationBinding; +import com.coder.guoy.recyclerview.databinding.ProjectItemBinding; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Version:V1.0 + * @Author:Guoy + * @CreateTime:2017/7/19 + * @Descrpiton:仿支付宝小应用界面适配器模式 + */ +public class Classification extends LinearLayout { + private List list = new ArrayList(); + private List contentList = new ArrayList(); + private RecyclerView recyclerView; + private TitleAdapter titleadapter; + private ContentAdapter contentAdapter; + private ItemCallBackListener itemCallBackListener; + + public Classification(Context context) { + super(context); + init(context, null); + } + + public Classification(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + init(context, attrs); + } + + public Classification(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context, attrs); + } + + private void init(Context context, @Nullable AttributeSet attrs) { + View view = LayoutInflater.from(context).inflate(R.layout.classification_zfb, this, true); + recyclerView = (RecyclerView) view.findViewById(R.id.classification_zfb); + } + + /** + * @param titleList 标题集合 + * @param contentlist 内容集合 + */ + public void setList(List titleList, List contentlist) { + list = titleList; + contentList = contentlist; + titleadapter = new TitleAdapter(getContext(), list, contentList); + recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + recyclerView.setAdapter(titleadapter); + } + + public ItemCallBackListener getItemCallBackListener() { + return itemCallBackListener; + } + + public void setItemCallBackListener(ItemCallBackListener itemCallBackListener) { + this.itemCallBackListener = itemCallBackListener; + } + + /** + * 标题适配器 + */ + private class TitleAdapter extends RecyclerView.Adapter { + private List titleList; + private List contentList; + private LayoutInflater mInflater; + private ItemClassificationBinding normalBinding; + + public TitleAdapter(Context context, List titleList, List contentList) { + mInflater = LayoutInflater.from(context); + this.titleList = titleList; + this.contentList = contentList; + } + + private class NormalViewHolder extends RecyclerView.ViewHolder { + public RecyclerView contentRecycler; + public TextView title; + + public NormalViewHolder(View itemView) { + super(itemView); + contentRecycler = normalBinding.recyclerContent; + title = normalBinding.textTitle; + } + } + + // 获取条目数量 + @Override + public int getItemCount() { + return titleList.size(); + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + normalBinding = DataBindingUtil.inflate(mInflater, R.layout.item_classification, parent, false); + return new NormalViewHolder(normalBinding.getRoot()); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { + NormalViewHolder vh = (NormalViewHolder) holder; + vh.title.setText(titleList.get(position)); + contentAdapter = new ContentAdapter(getContext(), contentList.get(position)); + vh.contentRecycler.setLayoutManager(new GridLayoutManager(getContext(), 4)); + vh.contentRecycler.setAdapter(contentAdapter); + } + } + + /** + * 内容适配器 + */ + public class ContentAdapter extends RecyclerView.Adapter { + + private List contentList; + private LayoutInflater mInflater; + private ProjectItemBinding contentBinding; + + public ContentAdapter(Context context, List contentList) { + mInflater = LayoutInflater.from(context); + this.contentList = contentList; + } + + public class ContentHolder extends RecyclerView.ViewHolder { + + public TextView text; + public ImageView image; + public FrameLayout layout; + + public ContentHolder(View itemView) { + super(itemView); + text = contentBinding.text; + image = contentBinding.beibiimage; + layout = contentBinding.item; + } + } + + @Override + public int getItemCount() { + return contentList.size(); + } + + @Override + public ContentHolder onCreateViewHolder(ViewGroup parent, int viewType) { + contentBinding = DataBindingUtil.inflate(mInflater, R.layout.project_item, parent, false); + return new ContentHolder(contentBinding.getRoot()); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { + ContentHolder ch = (ContentHolder) holder; + ch.text.setText(contentList.get(position)); + ch.layout.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + itemCallBackListener.itemOnClick(position, contentList.get(position)); + } + }); + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/view/alipay/ItemCallBackListener.java b/app/src/main/java/com/coder/guoy/recyclerview/view/alipay/ItemCallBackListener.java new file mode 100644 index 0000000..57af9ca --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/view/alipay/ItemCallBackListener.java @@ -0,0 +1,11 @@ +package com.coder.guoy.recyclerview.view.alipay; + +/** + * @Version: + * @Author:Guoy + * @CreateTime:2017/7/20 + * @Descrpiton:条目点击接口 + */ +public interface ItemCallBackListener { + void itemOnClick(int position, CharSequence content); +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/view/classification/Classification.java b/app/src/main/java/com/coder/guoy/recyclerview/view/classification/Classification.java new file mode 100644 index 0000000..81f92b3 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/view/classification/Classification.java @@ -0,0 +1,284 @@ +package com.coder.guoy.recyclerview.view.classification; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.support.annotation.Nullable; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.coder.guoy.recyclerview.R; + +import java.util.ArrayList; +import java.util.List; + + +/** + * @Version: + * @Author:Guoy + * @CreateTime:2017/5/23 + * @Descrpiton:自定义组合控件效果类似于百度地图搜索下的更多页面 + */ +public class Classification extends LinearLayout implements View.OnClickListener { + private String TAG = "Classification"; + private ImageView icon; + private TextView title; + private TextView contentText1, contentText2, contentText3, contentText4; + private TextView contentText5, contentText6, contentText7, contentText8; + private LinearLayout contentLayout1, contentLayout2; + + private List contentList = new ArrayList(); + private String classTitle; + private Drawable classIcon; + + private OnContentTextClickListener listener; + + //在代码调用的时候使用 + public Classification(Context context) { + super(context); + init(context, null); + } + + //在布局文件中使用的时候调用 + public Classification(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + init(context, attrs); + } + + //在布局文件中使用的时候调用,比两个参数的多个样式文件 + public Classification(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context, attrs); + } + + private void init(Context context, @Nullable AttributeSet attrs) { + View view = LayoutInflater.from(context).inflate(R.layout.classification, this, true); + icon = (ImageView) view.findViewById(R.id.icon); + title = (TextView) view.findViewById(R.id.title); + contentLayout1 = (LinearLayout) view.findViewById(R.id.content_layout1); + contentLayout2 = (LinearLayout) view.findViewById(R.id.content_layout2); + contentText1 = (TextView) view.findViewById(R.id.textview1); + contentText2 = (TextView) view.findViewById(R.id.textview2); + contentText3 = (TextView) view.findViewById(R.id.textview3); + contentText4 = (TextView) view.findViewById(R.id.textview4); + contentText5 = (TextView) view.findViewById(R.id.textview5); + contentText6 = (TextView) view.findViewById(R.id.textview6); + contentText7 = (TextView) view.findViewById(R.id.textview7); + contentText8 = (TextView) view.findViewById(R.id.textview8); + + TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.Classification); + if (typedArray != null) { + //设置icon + classIcon = typedArray.getDrawable(R.styleable.Classification_icon); + if (classIcon == null) { + //设置默认图标 + icon.setImageResource(R.drawable.classcsjz); + } else { + setIcon(classIcon); + } + + //设置title + classTitle = typedArray.getString(R.styleable.Classification_title); + if (classTitle == null) { + //设置默认标题 + title.setText("请设置标题"); + } else { + setTitle(classTitle); + } + typedArray.recycle(); + } + } + + /** + * 设置Title + * + * @param classTitle + */ + public void setTitle(String classTitle) { + title.setText(classTitle); + } + + /** + * 设置Icon + * + * @param drawable + */ + public void setIcon(Drawable drawable) { + icon.setImageDrawable(drawable); + } + + /** + * 设置内容标题 + * @param list + */ + public void setList(List list) { + //设置内容 + switch (list.size()) { + case 1: + showLineOne(); + showTextOne(list); + break; + case 2: + showLineOne(); + showTextOne(list); + showTextTwo(list); + break; + case 3: + showLineOne(); + showTextOne(list); + showTextTwo(list); + showTextThree(list); + break; + case 4: + showLineOne(); + showTextOne(list); + showTextTwo(list); + showTextThree(list); + showTextFore(list); + break; + case 5: + showLineTwo(); + showTextOne(list); + showTextTwo(list); + showTextThree(list); + showTextFore(list); + showTextFive(list); + break; + case 6: + showLineTwo(); + showTextOne(list); + showTextTwo(list); + showTextThree(list); + showTextFore(list); + showTextFive(list); + showTextSix(list); + break; + case 7: + showLineTwo(); + showTextOne(list); + showTextTwo(list); + showTextThree(list); + showTextFore(list); + showTextFive(list); + showTextSix(list); + showTextSeven(list); + break; + case 8: + showLineTwo(); + showTextOne(list); + showTextTwo(list); + showTextThree(list); + showTextFore(list); + showTextFive(list); + showTextSix(list); + showTextSeven(list); + showTextEight(list); + break; + } + } + + private void showTextOne(List list) { + contentText1.setVisibility(VISIBLE); + contentText1.setText(list.get(0)); + contentText1.setOnClickListener(this); + } + + private void showTextTwo(List list) { + contentText2.setVisibility(VISIBLE); + contentText2.setText(list.get(1)); + contentText2.setOnClickListener(this); + } + + private void showTextThree(List list) { + contentText3.setVisibility(VISIBLE); + contentText3.setText(list.get(2)); + contentText3.setOnClickListener(this); + } + + private void showTextFore(List list) { + contentText4.setVisibility(VISIBLE); + contentText4.setText(list.get(3)); + contentText4.setOnClickListener(this); + } + + private void showTextFive(List list) { + contentText5.setVisibility(VISIBLE); + contentText5.setText(list.get(4)); + contentText5.setOnClickListener(this); + } + + private void showTextSix(List list) { + contentText6.setVisibility(VISIBLE); + contentText6.setText(list.get(5)); + contentText6.setOnClickListener(this); + } + + private void showTextSeven(List list) { + contentText7.setVisibility(VISIBLE); + contentText7.setText(list.get(6)); + contentText7.setOnClickListener(this); + } + + private void showTextEight(List list) { + contentText8.setVisibility(VISIBLE); + contentText8.setText(list.get(7)); + contentText8.setOnClickListener(this); + } + + /** + * 显示内容区域第一行 + */ + private void showLineOne() { + contentLayout1.setVisibility(VISIBLE); + contentLayout2.setVisibility(GONE); + } + /** + * 显示内容区域第二行 + */ + private void showLineTwo() { + contentLayout1.setVisibility(VISIBLE); + contentLayout2.setVisibility(VISIBLE); + } + + public OnContentTextClickListener getListener() { + return listener; + } + + public void setListener(OnContentTextClickListener listener) { + this.listener = listener; + } + + @Override + public void onClick(View v) { + switch (v.getId()){ + case R.id.textview1: + listener.onContentTextClick(contentText1.getText()); + break; + case R.id.textview2: + listener.onContentTextClick(contentText2.getText()); + break; + case R.id.textview3: + listener.onContentTextClick(contentText3.getText()); + break; + case R.id.textview4: + listener.onContentTextClick(contentText4.getText()); + break; + case R.id.textview5: + listener.onContentTextClick(contentText5.getText()); + break; + case R.id.textview6: + listener.onContentTextClick(contentText6.getText()); + break; + case R.id.textview7: + listener.onContentTextClick(contentText7.getText()); + break; + case R.id.textview8: + listener.onContentTextClick(contentText8.getText()); + break; + } + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/view/classification/OnContentTextClickListener.java b/app/src/main/java/com/coder/guoy/recyclerview/view/classification/OnContentTextClickListener.java new file mode 100644 index 0000000..7ada05e --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/view/classification/OnContentTextClickListener.java @@ -0,0 +1,11 @@ +package com.coder.guoy.recyclerview.view.classification; + +/** + * @Version: + * @Author:Guoy + * @CreateTime:2017/5/27 + * @Descrpiton: + */ +public interface OnContentTextClickListener { + void onContentTextClick(CharSequence content); +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/view/statusbar/StatusBarUtil.java b/app/src/main/java/com/coder/guoy/recyclerview/view/statusbar/StatusBarUtil.java new file mode 100644 index 0000000..f80fb3c --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/view/statusbar/StatusBarUtil.java @@ -0,0 +1,576 @@ +package com.coder.guoy.recyclerview.view.statusbar; + +import android.annotation.TargetApi; +import android.app.Activity; +import android.app.TabActivity; +import android.content.Context; +import android.graphics.Color; +import android.os.Build; +import android.support.annotation.ColorInt; +import android.support.v4.widget.DrawerLayout; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.LinearLayout; + +/** + * Created by Jaeger on 16/2/14. + *

+ * Email: chjie.jaeger@gmail.com + * GitHub: https://github.com/laobie + */ +public class StatusBarUtil { + + public static final int DEFAULT_STATUS_BAR_ALPHA = 112; + + /** + * 设置状态栏颜色 + * + * @param activity 需要设置的 activity + * @param color 状态栏颜色值 + */ + public static void setColor(Activity activity, @ColorInt int color) { + setColor(activity, color, DEFAULT_STATUS_BAR_ALPHA); + } + + /** + * 设置状态栏颜色 + * + * @param activity 需要设置的activity + * @param color 状态栏颜色值 + * @param statusBarAlpha 状态栏透明度 + */ + + public static void setColor(Activity activity, @ColorInt int color, int statusBarAlpha) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + activity.getWindow().setStatusBarColor(calculateStatusColor(color, statusBarAlpha)); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView(); + int count = decorView.getChildCount(); + if (count > 0 && decorView.getChildAt(count - 1) instanceof StatusBarView) { + decorView.getChildAt(count - 1).setBackgroundColor(calculateStatusColor(color, statusBarAlpha)); + } else { + StatusBarView statusView = createStatusBarView(activity, color, statusBarAlpha); + decorView.addView(statusView); + } + setRootView(activity); + } + } + + /** + * 设置状态栏纯色 不加半透明效果 + * + * @param activity 需要设置的 activity + * @param color 状态栏颜色值 + */ + public static void setColorNoTranslucent(Activity activity, @ColorInt int color) { + setColor(activity, color, 0); + } + + /** + * 设置状态栏颜色(5.0以下无半透明效果,不建议使用) + * + * @param activity 需要设置的 activity + * @param color 状态栏颜色值 + */ + @Deprecated + public static void setColorDiff(Activity activity, @ColorInt int color) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + return; + } + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + // 生成一个状态栏大小的矩形 + ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView(); + int count = decorView.getChildCount(); + if (count > 0 && decorView.getChildAt(count - 1) instanceof StatusBarView) { + decorView.getChildAt(count - 1).setBackgroundColor(color); + } else { + StatusBarView statusView = createStatusBarView(activity, color); + decorView.addView(statusView); + } + setRootView(activity); + } + + /** + * 使状态栏半透明 + *

+ * 适用于图片作为背景的界面,此时需要图片填充到状态栏 + * + * @param activity 需要设置的activity + */ + public static void setTranslucent(Activity activity) { + setTranslucent(activity, DEFAULT_STATUS_BAR_ALPHA); + } + + /** + * 使状态栏半透明 + *

+ * 适用于图片作为背景的界面,此时需要图片填充到状态栏 + * + * @param activity 需要设置的activity + * @param statusBarAlpha 状态栏透明度 + */ + public static void setTranslucent(Activity activity, int statusBarAlpha) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + return; + } + setTransparent(activity); + addTranslucentView(activity, statusBarAlpha); + } + + /** + * 针对根布局是 CoordinatorLayout, 使状态栏半透明 + *

+ * 适用于图片作为背景的界面,此时需要图片填充到状态栏 + * + * @param activity 需要设置的activity + * @param statusBarAlpha 状态栏透明度 + */ + public static void setTranslucentForCoordinatorLayout(Activity activity, int statusBarAlpha) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + return; + } + transparentStatusBar(activity); + addTranslucentView(activity, statusBarAlpha); + } + + /** + * 设置状态栏全透明 + * + * @param activity 需要设置的activity + */ + public static void setTransparent(Activity activity) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + return; + } + transparentStatusBar(activity); + setRootView(activity); + } + + /** + * 使状态栏透明(5.0以上半透明效果,不建议使用) + *

+ * 适用于图片作为背景的界面,此时需要图片填充到状态栏 + * + * @param activity 需要设置的activity + */ + @Deprecated + public static void setTranslucentDiff(Activity activity) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + // 设置状态栏透明 + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + setRootView(activity); + } + } + + /** + * 为DrawerLayout 布局设置状态栏变色 + * + * @param activity 需要设置的activity + * @param drawerLayout DrawerLayout + * @param color 状态栏颜色值 + */ + public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, @ColorInt int color) { + setColorForDrawerLayout(activity, drawerLayout, color, DEFAULT_STATUS_BAR_ALPHA); + } + + /** + * 为DrawerLayout 布局设置状态栏颜色,纯色 + * + * @param activity 需要设置的activity + * @param drawerLayout DrawerLayout + * @param color 状态栏颜色值 + */ + public static void setColorNoTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout, @ColorInt int color) { + setColorForDrawerLayout(activity, drawerLayout, color, 0); + } + + /** + * 为DrawerLayout 布局设置状态栏变色 + * + * @param activity 需要设置的activity + * @param drawerLayout DrawerLayout + * @param color 状态栏颜色值 + * @param statusBarAlpha 状态栏透明度 + */ + public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, @ColorInt int color, + int statusBarAlpha) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + return; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + activity.getWindow().setStatusBarColor(Color.TRANSPARENT); + } else { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + } + // 生成一个状态栏大小的矩形 + // 添加 statusBarView 到布局中 + ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0); + if (contentLayout.getChildCount() > 0 && contentLayout.getChildAt(0) instanceof StatusBarView) { + contentLayout.getChildAt(0).setBackgroundColor(calculateStatusColor(color, statusBarAlpha)); + } else { + StatusBarView statusBarView = createStatusBarView(activity, color); + contentLayout.addView(statusBarView, 0); + } + // 内容布局不是 LinearLayout 时,设置padding top + if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) { + contentLayout.getChildAt(1) + .setPadding(contentLayout.getPaddingLeft(), getStatusBarHeight(activity) + contentLayout.getPaddingTop(), + contentLayout.getPaddingRight(), contentLayout.getPaddingBottom()); + } + // 设置属性 + ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1); + drawerLayout.setFitsSystemWindows(false); + contentLayout.setFitsSystemWindows(false); + contentLayout.setClipToPadding(true); + drawer.setFitsSystemWindows(false); + + addTranslucentView(activity, statusBarAlpha); + } + + /** + * 为DrawerLayout 布局设置状态栏变色(5.0以下无半透明效果,不建议使用) + * + * @param activity 需要设置的activity + * @param drawerLayout DrawerLayout + * @param color 状态栏颜色值 + */ + @Deprecated + public static void setColorForDrawerLayoutDiff(Activity activity, DrawerLayout drawerLayout, @ColorInt int color) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + // 生成一个状态栏大小的矩形 + ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0); + if (contentLayout.getChildCount() > 0 && contentLayout.getChildAt(0) instanceof StatusBarView) { + contentLayout.getChildAt(0).setBackgroundColor(calculateStatusColor(color, DEFAULT_STATUS_BAR_ALPHA)); + } else { + // 添加 statusBarView 到布局中 + StatusBarView statusBarView = createStatusBarView(activity, color); + contentLayout.addView(statusBarView, 0); + } + // 内容布局不是 LinearLayout 时,设置padding top + if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) { + contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0); + } + // 设置属性 + ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1); + drawerLayout.setFitsSystemWindows(false); + contentLayout.setFitsSystemWindows(false); + contentLayout.setClipToPadding(true); + drawer.setFitsSystemWindows(false); + } + } + + /** + * 为 DrawerLayout 布局设置状态栏透明 + * + * @param activity 需要设置的activity + * @param drawerLayout DrawerLayout + */ + public static void setTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout) { + setTranslucentForDrawerLayout(activity, drawerLayout, DEFAULT_STATUS_BAR_ALPHA); + } + + /** + * 为 DrawerLayout 布局设置状态栏透明 + * + * @param activity 需要设置的activity + * @param drawerLayout DrawerLayout + */ + public static void setTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int statusBarAlpha) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + return; + } + setTransparentForDrawerLayout(activity, drawerLayout); + addTranslucentView(activity, statusBarAlpha); + } + + /** + * 为 DrawerLayout 布局设置状态栏透明 + * + * @param activity 需要设置的activity + * @param drawerLayout DrawerLayout + */ + public static void setTransparentForDrawerLayout(Activity activity, DrawerLayout drawerLayout) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + return; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + activity.getWindow().setStatusBarColor(Color.TRANSPARENT); + } else { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + } + + ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0); + // 内容布局不是 LinearLayout 时,设置padding top + if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) { + contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0); + } + + // 设置属性 + ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1); + drawerLayout.setFitsSystemWindows(false); + contentLayout.setFitsSystemWindows(false); + contentLayout.setClipToPadding(true); + drawer.setFitsSystemWindows(false); + } + + /** + * 为 DrawerLayout 布局设置状态栏透明(5.0以上半透明效果,不建议使用) + * + * @param activity 需要设置的activity + * @param drawerLayout DrawerLayout + */ + @Deprecated + public static void setTranslucentForDrawerLayoutDiff(Activity activity, DrawerLayout drawerLayout) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + // 设置状态栏透明 + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + // 设置内容布局属性 + ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0); + contentLayout.setFitsSystemWindows(true); + contentLayout.setClipToPadding(true); + // 设置抽屉布局属性 + ViewGroup vg = (ViewGroup) drawerLayout.getChildAt(1); + vg.setFitsSystemWindows(false); + // 设置 DrawerLayout 属性 + drawerLayout.setFitsSystemWindows(false); + } + } + + /** + * 为头部是 ImageView 的界面设置状态栏全透明 + * + * @param activity 需要设置的activity + * @param needOffsetView 需要向下偏移的 View + */ + public static void setTransparentForImageView(Activity activity, View needOffsetView) { + setTranslucentForImageView(activity, 0, needOffsetView); + } + + /** + * 为头部是 ImageView 的界面设置状态栏透明(使用默认透明度) + * + * @param activity 需要设置的activity + * @param needOffsetView 需要向下偏移的 View + */ + public static void setTranslucentForImageView(Activity activity, View needOffsetView) { + setTranslucentForImageView(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView); + } + + /** + * 为头部是 ImageView 的界面设置状态栏透明 + * + * @param activity 需要设置的activity + * @param statusBarAlpha 状态栏透明度 + * @param needOffsetView 需要向下偏移的 View + */ + public static void setTranslucentForImageView(Activity activity, int statusBarAlpha, View needOffsetView) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + return; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().setStatusBarColor(Color.TRANSPARENT); + activity.getWindow() + .getDecorView() + .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + if (activity instanceof TabActivity){ + activity.getWindow()//兼容TabActivity + .setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + } + } else { + activity.getWindow() + .setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + } + addTranslucentView(activity, statusBarAlpha); + if (needOffsetView != null) { + ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) needOffsetView.getLayoutParams(); + if (layoutParams != null) { + layoutParams.setMargins(0, getStatusBarHeight(activity), 0, 0); + } + } + } + + public static void setMargin(Activity activity, View needOffsetView) { + if (needOffsetView != null) { + ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) needOffsetView.getLayoutParams(); + if (layoutParams != null) { + layoutParams.setMargins(0, getStatusBarHeight(activity), 0, 0); + } + } + } + + + /** + * 为 fragment 头部是 ImageView 的设置状态栏透明 + * + * @param activity fragment 对应的 activity + * @param needOffsetView 需要向下偏移的 View + */ + public static void setTranslucentForImageViewInFragment(Activity activity, View needOffsetView) { + setTranslucentForImageViewInFragment(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView); + } + + /** + * 为 fragment 头部是 ImageView 的设置状态栏透明 + * + * @param activity fragment 对应的 activity + * @param needOffsetView 需要向下偏移的 View + */ + public static void setTransparentForImageViewInFragment(Activity activity, View needOffsetView) { + setTranslucentForImageViewInFragment(activity, 0, needOffsetView); + } + + /** + * 为 fragment 头部是 ImageView 的设置状态栏透明 + * + * @param activity fragment 对应的 activity + * @param statusBarAlpha 状态栏透明度 + * @param needOffsetView 需要向下偏移的 View + */ + public static void setTranslucentForImageViewInFragment(Activity activity, int statusBarAlpha, View needOffsetView) { + setTranslucentForImageView(activity, statusBarAlpha, needOffsetView); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + clearPreviousSetting(activity); + } + } + + @TargetApi(Build.VERSION_CODES.KITKAT) + private static void clearPreviousSetting(Activity activity) { + ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView(); + int count = decorView.getChildCount(); + if (count > 0 && decorView.getChildAt(count - 1) instanceof StatusBarView) { + decorView.removeViewAt(count - 1); + ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0); + rootView.setPadding(0, 0, 0, 0); + } + } + + /** + * 添加半透明矩形条 + * + * @param activity 需要设置的 activity + * @param statusBarAlpha 透明值 + */ + private static void addTranslucentView(Activity activity, int statusBarAlpha) { + ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content); + if (contentView.getChildCount() > 1) { + contentView.getChildAt(1).setBackgroundColor(Color.argb(statusBarAlpha, 0, 0, 0)); + } else { + contentView.addView(createTranslucentStatusBarView(activity, statusBarAlpha)); + } + } + + /** + * 生成一个和状态栏大小相同的彩色矩形条 + * + * @param activity 需要设置的 activity + * @param color 状态栏颜色值 + * @return 状态栏矩形条 + */ + private static StatusBarView createStatusBarView(Activity activity, @ColorInt int color) { + // 绘制一个和状态栏一样高的矩形 + StatusBarView statusBarView = new StatusBarView(activity); + LinearLayout.LayoutParams params = + new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); + statusBarView.setLayoutParams(params); + statusBarView.setBackgroundColor(color); + return statusBarView; + } + + /** + * 生成一个和状态栏大小相同的半透明矩形条 + * + * @param activity 需要设置的activity + * @param color 状态栏颜色值 + * @param alpha 透明值 + * @return 状态栏矩形条 + */ + private static StatusBarView createStatusBarView(Activity activity, @ColorInt int color, int alpha) { + // 绘制一个和状态栏一样高的矩形 + StatusBarView statusBarView = new StatusBarView(activity); + LinearLayout.LayoutParams params = + new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); + statusBarView.setLayoutParams(params); + statusBarView.setBackgroundColor(calculateStatusColor(color, alpha)); + return statusBarView; + } + + /** + * 设置根布局参数 + */ + private static void setRootView(Activity activity) { + ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0); + rootView.setFitsSystemWindows(true); + rootView.setClipToPadding(true); + } + + /** + * 使状态栏透明 + */ + @TargetApi(Build.VERSION_CODES.KITKAT) + private static void transparentStatusBar(Activity activity) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + activity.getWindow().setStatusBarColor(Color.TRANSPARENT); + } else { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + } + } + + /** + * 创建半透明矩形 View + * + * @param alpha 透明值 + * @return 半透明 View + */ + private static StatusBarView createTranslucentStatusBarView(Activity activity, int alpha) { + // 绘制一个和状态栏一样高的矩形 + StatusBarView statusBarView = new StatusBarView(activity); + LinearLayout.LayoutParams params = + new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); + statusBarView.setLayoutParams(params); + statusBarView.setBackgroundColor(Color.argb(alpha, 0, 0, 0)); + return statusBarView; + } + + /** + * 获取状态栏高度 + * + * @param context context + * @return 状态栏高度 + */ + public static int getStatusBarHeight(Context context) { + // 获得状态栏高度 + int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); + return context.getResources().getDimensionPixelSize(resourceId); + } + + /** + * 计算状态栏颜色 + * + * @param color color值 + * @param alpha alpha值 + * @return 最终的状态栏颜色 + */ + private static int calculateStatusColor(@ColorInt int color, int alpha) { + float a = 1 - alpha / 255f; + int red = color >> 16 & 0xff; + int green = color >> 8 & 0xff; + int blue = color & 0xff; + red = (int) (red * a + 0.5); + green = (int) (green * a + 0.5); + blue = (int) (blue * a + 0.5); + return 0xff << 24 | red << 16 | green << 8 | blue; + } + +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/view/statusbar/StatusBarView.java b/app/src/main/java/com/coder/guoy/recyclerview/view/statusbar/StatusBarView.java new file mode 100644 index 0000000..a9ee836 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/view/statusbar/StatusBarView.java @@ -0,0 +1,21 @@ +package com.coder.guoy.recyclerview.view.statusbar; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; + +/** + * Created by Jaeger on 16/6/8. + * + * Email: chjie.jaeger@gmail.com + * GitHub: https://github.com/laobie + */ +public class StatusBarView extends View { + public StatusBarView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public StatusBarView(Context context) { + super(context); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/view/tagcloud/Tag.java b/app/src/main/java/com/coder/guoy/recyclerview/view/tagcloud/Tag.java new file mode 100644 index 0000000..2164839 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/view/tagcloud/Tag.java @@ -0,0 +1,141 @@ +package com.coder.guoy.recyclerview.view.tagcloud; + +import android.graphics.Color; + +/** + * Copyright © 2016 moxun + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the “Software”), + * to deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE + * OR OTHER DEALINGS IN THE SOFTWARE. + */ + +public class Tag { + + private int popularity; //this is the importance/popularity of the Tag + private float locX, locY, locZ; //the center of the 3D Tag + private float loc2DX, loc2DY; + private float scale; + private float[] argb; + private static final int DEFAULT_POPULARITY = 5; + + public Tag() { + this(0f, 0f, 0f, 1.0f, 0); + } + + public Tag(int popularity) { + this(0f, 0f, 0f, 1.0f, popularity); + } + + public Tag(float locX, float locY, float locZ) { + this(locX, locY, locZ, 1.0f, DEFAULT_POPULARITY); + } + + public Tag(float locX, float locY, float locZ, float scale) { + this(locX, locY, locZ, scale, DEFAULT_POPULARITY); + } + + public Tag(float locX, float locY, float locZ, float scale, int popularity) { + this.locX = locX; + this.locY = locY; + this.locZ = locZ; + + this.loc2DX = 0; + this.loc2DY = 0; + + this.argb = new float[]{1.0f, 0.5f, 0.5f, 0.5f}; + + this.scale = scale; + this.popularity = popularity; + } + + public float getLocX() { + return locX; + } + + public void setLocX(float locX) { + this.locX = locX; + } + + public float getLocY() { + return locY; + } + + public void setLocY(float locY) { + this.locY = locY; + } + + public float getLocZ() { + return locZ; + } + + public void setLocZ(float locZ) { + this.locZ = locZ; + } + + public float getScale() { + return scale; + } + + public void setScale(float scale) { + this.scale = scale; + } + + public void setAlpha(float alpha) { + this.argb[0] = alpha; + } + + public int getPopularity() { + return popularity; + } + + public void setPopularity(int popularity) { + this.popularity = popularity; + } + + public float getLoc2DX() { + return loc2DX; + } + + public void setLoc2DX(float loc2dx) { + loc2DX = loc2dx; + } + + public float getLoc2DY() { + return loc2DY; + } + + public void setLoc2DY(float loc2dy) { + loc2DY = loc2dy; + } + + public void setColorByArray(float[] rgb) { + if (rgb != null) { + System.arraycopy(rgb, 0, this.argb, this.argb.length - rgb.length , rgb.length); + } + } + + public int getColor() { + int[] result = new int[4]; + for (int i = 0; i < 4; i++) { + result[i] = (int) (this.argb[i] * 0xff); + } + int color = Color.argb(result[0], result[1], result[2], result[3]); + //Log.e("TAG","#" + Integer.toHexString(color)); + return color; + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/view/tagcloud/TagCloud.java b/app/src/main/java/com/coder/guoy/recyclerview/view/tagcloud/TagCloud.java new file mode 100644 index 0000000..015d7dc --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/view/tagcloud/TagCloud.java @@ -0,0 +1,268 @@ +package com.coder.guoy.recyclerview.view.tagcloud; + +/** + * Copyright © 2016 moxun + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the “Software”), + * to deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE + * OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import java.util.ArrayList; +import java.util.List; + +public class TagCloud { + + private List tagCloud; + private int radius; + private static final int DEFAULT_RADIUS = 3; + private static final float[] DEFAULT_COLOR_DARK = {0.886f, 0.725f, 0.188f, 1f}; + private static final float[] DEFAULT_COLOR_LIGHT = {0.3f, 0.3f, 0.3f, 1f}; + private float[] tagColorLight; //text color 1(rgb Alpha) + private float[] tagColorDark; //text color 2 (rgb Alpha) + private float sin_mAngleX, cos_mAngleX, sin_mAngleY, cos_mAngleY, sin_mAngleZ, cos_mAngleZ; + private float mAngleZ = 0; + private float mAngleX = 0; + private float mAngleY = 0; + //private int size = 0; + private int smallest, largest; //used to find spectrum for tag colors + private boolean distrEven = true; //default is to distribute tags evenly on the Cloud + + public TagCloud() { + this(DEFAULT_RADIUS); + } + + public TagCloud(int radius) { + this(new ArrayList(), radius); + } + + public TagCloud(List tags) { + this(tags, DEFAULT_RADIUS); + } + + //Constructor just copies the existing tags in its List + public TagCloud(List tags, int radius) { + this(tags, radius, DEFAULT_COLOR_DARK, DEFAULT_COLOR_LIGHT); + } + + public TagCloud(List tags, int radius, float[] tagColor1, float[] tagColor2) { + this.tagCloud = tags; //Java does the initialization and deep copying + this.radius = radius; + this.tagColorLight = tagColor1; + this.tagColorDark = tagColor2; + } + + //create method calculates the correct initial location of each tag + public void create(boolean distrEven) { + this.distrEven = distrEven; + //calculate and set the location of each Tag + positionAll(distrEven); + sineCosine(mAngleX, mAngleY, mAngleZ); + updateAll(); + //Now, let's calculate and set the color for each tag: + //first loop through all tags to find the smallest and largest populariteies + //largest popularity gets tcolor2, smallest gets tcolor1, the rest in between + smallest = 9999; + largest = 0; + for (int i = 0; i < tagCloud.size(); i++) { + int j = tagCloud.get(i).getPopularity(); + largest = Math.max(largest, j); + smallest = Math.min(smallest, j); + } + //figuring out and assigning the colors/ textsize + Tag tempTag; + for (int i = 0; i < tagCloud.size(); i++) { + tempTag = tagCloud.get(i); + + initTag(tempTag); + } + } + + public void clear() { + tagCloud.clear(); + } + + public List getTagList() { + return tagCloud; + } + + public void setTagList(List list) { + tagCloud = list; + } + + public Tag get(int position) { + return tagCloud.get(position); + } + + public Tag getTop() { + int i = tagCloud.size() - 1; + return get(i); + } + + public int indexOf(Tag tag) { + return tagCloud.indexOf(tag); + } + + public void reset() { + create(distrEven); + } + + //updates the transparency/scale of all elements + public void update() { + // if mAngleX and mAngleY under threshold, skip motion calculations for performance + if (Math.abs(mAngleX) > .1 || Math.abs(mAngleY) > .1) { + sineCosine(mAngleX, mAngleY, mAngleZ); + updateAll(); + } + } + + private void initTag(Tag tag) { + float percentage = getPercentage(tag); + float[] argb = getColorFromGradient(percentage); + tag.setColorByArray(argb); + } + + private float getPercentage(Tag tag) { + int p = tag.getPopularity(); + return (smallest == largest) ? 1.0f : ((float) p - smallest) / ((float) largest - smallest); + } + + //if a single tag needed to be added + public void add(Tag newTag) { + + initTag(newTag); + + position(distrEven, newTag); + //now add the new tag to the tagCloud + tagCloud.add(newTag); + updateAll(); + } + + private void position(boolean distrEven, Tag newTag) { + double phi = 0; + double theta = 0; + int max = tagCloud.size(); + //when adding a new tag, just place it at some random location + //this is in fact why adding too many elements make TagCloud ugly + //after many add, do one reset to rearrange all tags + phi = Math.random() * (Math.PI); + theta = Math.random() * (2 * Math.PI); + //coordinate conversion: + newTag.setLocX((int) (radius * Math.cos(theta) * Math.sin(phi))); + newTag.setLocY((int) (radius * Math.sin(theta) * Math.sin(phi))); + newTag.setLocZ((int) (radius * Math.cos(phi))); + } + + private void positionAll(boolean distrEven) { + double phi = 0; + double theta = 0; + int max = tagCloud.size(); + //distribute: (disrtEven is used to specify whether distribute random or even + for (int i = 1; i < max + 1; i++) { + if (distrEven) { + phi = Math.acos(-1.0 + (2.0 * i - 1.0) / max); + theta = Math.sqrt(max * Math.PI) * phi; + } else { + phi = Math.random() * (Math.PI); + theta = Math.random() * (2 * Math.PI); + } + + //coordinate conversion: + tagCloud.get(i - 1).setLocX((int) ((radius * Math.cos(theta) * Math.sin(phi)) + )); + tagCloud.get(i - 1).setLocY((int) (radius * Math.sin(theta) * Math.sin(phi))); + tagCloud.get(i - 1).setLocZ((int) (radius * Math.cos(phi))); + } + } + + private void updateAll() { + + //update transparency/scale for all tags: + int max = tagCloud.size(); + for (int j = 0; j < max; j++) { + //There exists two options for this part: + // multiply positions by a x-rotation matrix + float rx1 = (tagCloud.get(j).getLocX()); + float ry1 = (tagCloud.get(j).getLocY()) * cos_mAngleX + + tagCloud.get(j).getLocZ() * -sin_mAngleX; + float rz1 = (tagCloud.get(j).getLocY()) * sin_mAngleX + + tagCloud.get(j).getLocZ() * cos_mAngleX; + // multiply new positions by a y-rotation matrix + float rx2 = rx1 * cos_mAngleY + rz1 * sin_mAngleY; + float ry2 = ry1; + float rz2 = rx1 * -sin_mAngleY + rz1 * cos_mAngleY; + // multiply new positions by a z-rotation matrix + float rx3 = rx2 * cos_mAngleZ + ry2 * -sin_mAngleZ; + float ry3 = rx2 * sin_mAngleZ + ry2 * cos_mAngleZ; + float rz3 = rz2; + // set arrays to new positions + tagCloud.get(j).setLocX(rx3); + tagCloud.get(j).setLocY(ry3); + tagCloud.get(j).setLocZ(rz3); + + // add perspective + int diameter = 2 * radius; + float per = diameter / 1.0f / (diameter + rz3); + // let's set position, scale, alpha for the tag; + tagCloud.get(j).setLoc2DX((int) (rx3 * per)); + tagCloud.get(j).setLoc2DY((int) (ry3 * per)); + tagCloud.get(j).setScale(per); + tagCloud.get(j).setAlpha(per / 2); + } + } + + private float[] getColorFromGradient(float percentage) { + //perc: 1.0 full dark; 0.0 full light + float[] rgba = new float[4]; + rgba[0] = 1f; //Alpha is 1.0 when init. + rgba[1] = (percentage * (tagColorDark[0])) + ((1f - percentage) * (tagColorLight[0])); + rgba[2] = (percentage * (tagColorDark[1])) + ((1f - percentage) * (tagColorLight[1])); + rgba[3] = (percentage * (tagColorDark[2])) + ((1f - percentage) * (tagColorLight[2])); + return rgba; + } + + private void sineCosine(float mAngleX, float mAngleY, float mAngleZ) { + double degToRad = (Math.PI / 180); + sin_mAngleX = (float) Math.sin(mAngleX * degToRad); + cos_mAngleX = (float) Math.cos(mAngleX * degToRad); + sin_mAngleY = (float) Math.sin(mAngleY * degToRad); + cos_mAngleY = (float) Math.cos(mAngleY * degToRad); + sin_mAngleZ = (float) Math.sin(mAngleZ * degToRad); + cos_mAngleZ = (float) Math.cos(mAngleZ * degToRad); + } + + public void setRadius(int radius) { + this.radius = radius; + } + + public void setTagColorLight(float[] tagColor) { + this.tagColorLight = tagColor; + } + + public void setTagColorDark(float[] tagColorDark) { + this.tagColorDark = tagColorDark; + } + + public void setAngleX(float mAngleX) { + this.mAngleX = mAngleX; + } + + public void setAngleY(float mAngleY) { + this.mAngleY = mAngleY; + } + +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/view/tagcloud/TagCloudView.java b/app/src/main/java/com/coder/guoy/recyclerview/view/tagcloud/TagCloudView.java new file mode 100644 index 0000000..952d124 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/view/tagcloud/TagCloudView.java @@ -0,0 +1,340 @@ +package com.coder.guoy.recyclerview.view.tagcloud; + +/** + * Copyright © 2016 moxun + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the “Software”), + * to deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE + * OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Color; +import android.graphics.Point; +import android.os.Build; +import android.os.Handler; +import android.os.Looper; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; + +import com.coder.guoy.recyclerview.R; + + +public class TagCloudView extends ViewGroup implements Runnable, TagsAdapter.OnDataSetChangeListener { + private final float TOUCH_SCALE_FACTOR = .8f; + private final float TRACKBALL_SCALE_FACTOR = 10; + private float tspeed = 2f; + private TagCloud mTagCloud; + private float mAngleX = 0.5f; + private float mAngleY = 0.5f; + private float centerX, centerY; + private float radius; + private float radiusPercent = 0.9f; + + private float[] darkColor = new float[]{1f, 0f, 0f, 1f};//rgba + private float[] lightColor = new float[]{0.9412f, 0.7686f, 0.2f, 1f};//rgba + + public static final int MODE_DISABLE = 0; + public static final int MODE_DECELERATE = 1; + public static final int MODE_UNIFORM = 2; + public int mode; + private int left, right, top, bottom; + + private MarginLayoutParams layoutParams; + private int minSize; + + private boolean isOnTouch = false; + private Handler handler = new Handler(Looper.getMainLooper()); + + private TagsAdapter tagsAdapter; + + public TagCloudView(Context context) { + super(context); + init(context,null); + } + + public TagCloudView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context,attrs); + } + + public TagCloudView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context,attrs); + } + + private void init(Context context, AttributeSet attrs) { + setFocusableInTouchMode(true); + mTagCloud = new TagCloud(); + if (attrs != null) { + TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TagCloudView); + + String m = typedArray.getString(R.styleable.TagCloudView_autoScrollMode); + mode = Integer.valueOf(m); + + int light = typedArray.getColor(R.styleable.TagCloudView_lightColor,Color.WHITE); + setLightColor(light); + + int dark = typedArray.getColor(R.styleable.TagCloudView_darkColor,Color.BLACK); + setDarkColor(dark); + + float p = typedArray.getFloat(R.styleable.TagCloudView_radiusPercent,radiusPercent); + setRadiusPercent(p); + + float s = typedArray.getFloat(R.styleable.TagCloudView_scrollSpeed,2f); + setScrollSpeed(s); + + typedArray.recycle(); + } + + WindowManager wm = (WindowManager) getContext() .getSystemService(Context.WINDOW_SERVICE); + Point point = new Point(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { + wm.getDefaultDisplay().getSize(point); + } else { + point.x = wm.getDefaultDisplay().getWidth(); + point.y = wm.getDefaultDisplay().getHeight(); + } + int screenWidth = point.x; + int screenHeight = point.y; + minSize = screenHeight < screenWidth ? screenHeight : screenWidth; + } + + public void setAutoScrollMode(int mode) { + this.mode = mode; + } + + public final void setAdapter(TagsAdapter adapter) { + tagsAdapter = adapter; + tagsAdapter.setOnDataSetChangeListener(this); + onChange(); + } + + public void setLightColor(int color) { + float[] argb = new float[4]; + argb[3] = Color.alpha(color) /1.0f / 0xff; + argb[0] = Color.red(color) /1.0f / 0xff; + argb[1] = Color.green(color) /1.0f / 0xff; + argb[2] = Color.blue(color) /1.0f / 0xff; + + lightColor = argb.clone(); + onChange(); + } + + public void setDarkColor(int color) { + float[] argb = new float[4]; + argb[3] = Color.alpha(color) /1.0f / 0xff; + argb[0] = Color.red(color) /1.0f / 0xff; + argb[1] = Color.green(color) /1.0f / 0xff; + argb[2] = Color.blue(color) /1.0f / 0xff; + + darkColor = argb.clone(); + onChange(); + } + + public void setRadiusPercent(float percent) { + if (percent > 1f || percent < 0f) { + throw new IllegalArgumentException("percent value not in range 0 to 1"); + } else { + radiusPercent = percent; + onChange(); + } + } + + private void initFromAdapter() { + this.postDelayed(new Runnable() { + @Override + public void run() { + centerX = (getRight() - getLeft()) / 2; + centerY = (getBottom() - getTop()) / 2; + radius = Math.min(centerX * radiusPercent, centerY * radiusPercent); + mTagCloud.setRadius((int) radius); + + mTagCloud.setTagColorLight(lightColor);//higher color + mTagCloud.setTagColorDark(darkColor);//lower color + + mTagCloud.clear(); + removeAllViews(); + for (int i = 0; i < tagsAdapter.getCount(); i++) { + TagCloudView.this.mTagCloud.add(new Tag(tagsAdapter.getPopularity(i))); + addView(tagsAdapter.getView(getContext(), i, TagCloudView.this)); + } + + mTagCloud.create(true); + + mTagCloud.setAngleX(mAngleX); + mTagCloud.setAngleY(mAngleY); + mTagCloud.update(); + } + }, 0); + } + + public void setScrollSpeed(float scrollSpeed) { + tspeed = scrollSpeed; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + int contentWidth = MeasureSpec.getSize(widthMeasureSpec); + int contentHeight = MeasureSpec.getSize(heightMeasureSpec); + int widthMode = MeasureSpec.getMode(widthMeasureSpec); + int heightMode = MeasureSpec.getMode(heightMeasureSpec); + + measureChildren(widthMode, heightMode); + + if(layoutParams == null) { + layoutParams = (MarginLayoutParams) getLayoutParams(); + } + + int dimensionX = widthMode == MeasureSpec.EXACTLY ? contentWidth : minSize - layoutParams.leftMargin - layoutParams.rightMargin; + int dimensionY = heightMode == MeasureSpec.EXACTLY ? contentHeight : minSize - layoutParams.leftMargin - layoutParams.rightMargin; + setMeasuredDimension(dimensionX, dimensionY); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + handler.post(this); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + handler.removeCallbacksAndMessages(null); + } + + @SuppressLint("WrongCall") + private void updateChild() { + onLayout(false, left,top,right,bottom); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + left = l; + right = r; + top = t; + bottom = b; + + for (int i = 0; i < getChildCount(); i++) { + View child = getChildAt(i); + if (child.getVisibility() != GONE) { + Tag tag = mTagCloud.get(i); + tagsAdapter.onThemeColorChanged(child,tag.getColor()); + child.setScaleX(tag.getScale()); + child.setScaleY(tag.getScale()); + int left, top; + left = (int) (centerX + tag.getLoc2DX()) - child.getMeasuredWidth() / 2; + top = (int) (centerY + tag.getLoc2DY()) - child.getMeasuredHeight() / 2; + + child.layout(left, top, left + child.getMeasuredWidth(), top + child.getMeasuredHeight()); + } + } + } + + public void reset() { + mTagCloud.reset(); + updateChild(); + } + + @Override + public boolean onTrackballEvent(MotionEvent e) { + float x = e.getX(); + float y = e.getY(); + + mAngleX = (y) * tspeed * TRACKBALL_SCALE_FACTOR; + mAngleY = (-x) * tspeed * TRACKBALL_SCALE_FACTOR; + + mTagCloud.setAngleX(mAngleX); + mTagCloud.setAngleY(mAngleY); + mTagCloud.update(); + + updateChild(); + return true; + } + + @Override + public boolean onTouchEvent(MotionEvent e) { + float x = e.getX(); + float y = e.getY(); + + switch (e.getAction()) { + case MotionEvent.ACTION_DOWN: + isOnTouch = true; + break; + case MotionEvent.ACTION_MOVE: + //rotate elements depending on how far the selection point is from center of cloud + float dx = x - centerX; + float dy = y - centerY; + mAngleX = (dy / radius) * tspeed * TOUCH_SCALE_FACTOR; + mAngleY = (-dx / radius) * tspeed * TOUCH_SCALE_FACTOR; + + processTouch(); + + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + isOnTouch = false; + break; + } + + return true; + } + + private void processTouch() { + if (mTagCloud != null) { + mTagCloud.setAngleX(mAngleX); + mTagCloud.setAngleY(mAngleY); + mTagCloud.update(); + } + updateChild(); + } + + @Override + public void onChange() { + initFromAdapter(); + } + + @Override + public void run() { + if (!isOnTouch && mode != MODE_DISABLE) { + if (mode == MODE_DECELERATE) { + if (mAngleX > 0.04f) { + mAngleX -= 0.02f; + } + if (mAngleY > 0.04f) { + mAngleY -= 0.02f; + } + if (mAngleX < -0.04f) { + mAngleX += 0.02f; + } + if (mAngleY < 0.04f) { + mAngleY += 0.02f; + } + } + processTouch(); + } + + handler.postDelayed(this, 50); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/view/tagcloud/TagsAdapter.java b/app/src/main/java/com/coder/guoy/recyclerview/view/tagcloud/TagsAdapter.java new file mode 100644 index 0000000..535b7df --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/view/tagcloud/TagsAdapter.java @@ -0,0 +1,49 @@ +package com.coder.guoy.recyclerview.view.tagcloud; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; + +/** + * Copyright © 2016 moxun + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the “Software”), + * to deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE + * OR OTHER DEALINGS IN THE SOFTWARE. + */ + +public abstract class TagsAdapter { + private OnDataSetChangeListener onDataSetChangeListener; + + public abstract int getCount(); + public abstract View getView(Context context, int position, ViewGroup parent); + public abstract Object getItem(int position); + public abstract int getPopularity(int position); + public abstract void onThemeColorChanged(View view,int themeColor); + + public final void notifyDataSetChanged() { + onDataSetChangeListener.onChange(); + } + + protected interface OnDataSetChangeListener{ + void onChange(); + } + + protected void setOnDataSetChangeListener(OnDataSetChangeListener listener) { + onDataSetChangeListener = listener; + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/view/textview/RectTextView.java b/app/src/main/java/com/coder/guoy/recyclerview/view/textview/RectTextView.java new file mode 100644 index 0000000..0366e06 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/view/textview/RectTextView.java @@ -0,0 +1,51 @@ +package com.coder.guoy.recyclerview.view.textview; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.support.annotation.Nullable; +import android.support.v7.widget.AppCompatTextView; +import android.util.AttributeSet; + +import com.coder.guoy.recyclerview.R; + +/** + * @Version: + * @Author:Guoy + * @CreateTime:2017/6/2 + * @Descrpiton: + */ +public class RectTextView extends AppCompatTextView { + public RectTextView(Context context) { + super(context); + } + + public RectTextView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public RectTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onDraw(Canvas canvas) { + Paint mPaint1 = new Paint(); + mPaint1.setColor(getResources().getColor(R.color.red)); + mPaint1.setStyle(Paint.Style.FILL); + Paint mPaint2 = new Paint(); + mPaint2.setColor(getResources().getColor(R.color.yello)); + mPaint2.setStyle(Paint.Style.FILL); + + //外层矩形 + canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),mPaint1); + //内层矩形 + canvas.drawRect(10,10,getMeasuredWidth()-10,getMeasuredHeight()-10,mPaint2); + canvas.save(); + //绘制文字前平移10像素 + canvas.translate(10,0); + //父类完成的方法,绘制文本 + super.onDraw(canvas); + canvas.restore(); + } +} diff --git a/app/src/main/java/com/coder/guoy/recyclerview/view/textview/ShaderTextView.java b/app/src/main/java/com/coder/guoy/recyclerview/view/textview/ShaderTextView.java new file mode 100644 index 0000000..202a320 --- /dev/null +++ b/app/src/main/java/com/coder/guoy/recyclerview/view/textview/ShaderTextView.java @@ -0,0 +1,70 @@ +package com.coder.guoy.recyclerview.view.textview; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.LinearGradient; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.Shader; +import android.support.v7.widget.AppCompatTextView; +import android.util.AttributeSet; + +/** + * @Version: + * @Author:Guoy + * @CreateTime:2017/6/2 + * @Descrpiton: + */ +public class ShaderTextView extends AppCompatTextView { + + private Matrix mGradientMatrix; + private LinearGradient mLinearGradient;//渐变渲染器 + private int mViewWidth = 0; + private int mTranslate; + + public ShaderTextView(Context context) { + super(context); + } + + public ShaderTextView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public ShaderTextView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (mGradientMatrix != null) { + mTranslate += mViewWidth / 5; + if (mTranslate > 2 * mViewWidth) { + mTranslate = -mViewWidth; + } + mGradientMatrix.setTranslate(mTranslate, 0); + mLinearGradient.setLocalMatrix(mGradientMatrix); + postInvalidateDelayed(100); + } + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + if (mViewWidth == 0) { + mViewWidth = getMeasuredWidth(); + if (mViewWidth > 0) { + // 使用getPaint()方法获取当前绘制TextView的Paint对象, + // 并给这个paint对象设置原生TextView没有的LinearGradient属性 + Paint mPaint = getPaint(); + mLinearGradient = new LinearGradient(0, 0, getMeasuredWidth(), 0, + new int[]{Color.RED, Color.YELLOW, Color.BLUE, Color.GREEN}, + null, Shader.TileMode.MIRROR); + mPaint.setShader(mLinearGradient); + mGradientMatrix = new Matrix(); + } + } + } + +} diff --git a/app/src/main/res/animator/animator_android.xml b/app/src/main/res/animator/animator_android.xml new file mode 100644 index 0000000..d0338bb --- /dev/null +++ b/app/src/main/res/animator/animator_android.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/animator/animator_astronaut_buble.xml b/app/src/main/res/animator/animator_astronaut_buble.xml new file mode 100644 index 0000000..e583570 --- /dev/null +++ b/app/src/main/res/animator/animator_astronaut_buble.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/animator/animator_astronaut_buble2.xml b/app/src/main/res/animator/animator_astronaut_buble2.xml new file mode 100644 index 0000000..dfcd387 --- /dev/null +++ b/app/src/main/res/animator/animator_astronaut_buble2.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/animator/animator_astronaut_buble3.xml b/app/src/main/res/animator/animator_astronaut_buble3.xml new file mode 100644 index 0000000..363c063 --- /dev/null +++ b/app/src/main/res/animator/animator_astronaut_buble3.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/animator/animator_astronaut_fly.xml b/app/src/main/res/animator/animator_astronaut_fly.xml new file mode 100644 index 0000000..559bb1a --- /dev/null +++ b/app/src/main/res/animator/animator_astronaut_fly.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/animator/animator_astronaut_shower.xml b/app/src/main/res/animator/animator_astronaut_shower.xml new file mode 100644 index 0000000..1891baa --- /dev/null +++ b/app/src/main/res/animator/animator_astronaut_shower.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/animator/animator_astronaut_shower1.xml b/app/src/main/res/animator/animator_astronaut_shower1.xml new file mode 100644 index 0000000..7f3f1ef --- /dev/null +++ b/app/src/main/res/animator/animator_astronaut_shower1.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/animator/animator_astronaut_shower2.xml b/app/src/main/res/animator/animator_astronaut_shower2.xml new file mode 100644 index 0000000..656f18f --- /dev/null +++ b/app/src/main/res/animator/animator_astronaut_shower2.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/animator/animator_eye_left_to_happy.xml b/app/src/main/res/animator/animator_eye_left_to_happy.xml new file mode 100644 index 0000000..05ebafc --- /dev/null +++ b/app/src/main/res/animator/animator_eye_left_to_happy.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/animator/animator_eye_left_to_sad.xml b/app/src/main/res/animator/animator_eye_left_to_sad.xml new file mode 100644 index 0000000..950d8c9 --- /dev/null +++ b/app/src/main/res/animator/animator_eye_left_to_sad.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/app/src/main/res/animator/animator_eye_right_to_happy.xml b/app/src/main/res/animator/animator_eye_right_to_happy.xml new file mode 100644 index 0000000..fe153ec --- /dev/null +++ b/app/src/main/res/animator/animator_eye_right_to_happy.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/app/src/main/res/animator/animator_eye_right_to_sad.xml b/app/src/main/res/animator/animator_eye_right_to_sad.xml new file mode 100644 index 0000000..128e0fd --- /dev/null +++ b/app/src/main/res/animator/animator_eye_right_to_sad.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/app/src/main/res/animator/animator_fingerprint.xml b/app/src/main/res/animator/animator_fingerprint.xml new file mode 100644 index 0000000..7d89745 --- /dev/null +++ b/app/src/main/res/animator/animator_fingerprint.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/animator/animator_line_heart.xml b/app/src/main/res/animator/animator_line_heart.xml new file mode 100644 index 0000000..f31ac89 --- /dev/null +++ b/app/src/main/res/animator/animator_line_heart.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/animator/animator_motorcycle_show.xml b/app/src/main/res/animator/animator_motorcycle_show.xml new file mode 100644 index 0000000..e2dfe5e --- /dev/null +++ b/app/src/main/res/animator/animator_motorcycle_show.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/animator/animator_mouth_smile_to_happy.xml b/app/src/main/res/animator/animator_mouth_smile_to_happy.xml new file mode 100644 index 0000000..e7866bd --- /dev/null +++ b/app/src/main/res/animator/animator_mouth_smile_to_happy.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/animator/animator_mouth_smile_to_sad.xml b/app/src/main/res/animator/animator_mouth_smile_to_sad.xml new file mode 100644 index 0000000..fdbf03c --- /dev/null +++ b/app/src/main/res/animator/animator_mouth_smile_to_sad.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/animator/animator_red_heart_colorempty.xml b/app/src/main/res/animator/animator_red_heart_colorempty.xml new file mode 100644 index 0000000..6e3e082 --- /dev/null +++ b/app/src/main/res/animator/animator_red_heart_colorempty.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/animator/animator_red_heart_colorfull.xml b/app/src/main/res/animator/animator_red_heart_colorfull.xml new file mode 100644 index 0000000..c09475f --- /dev/null +++ b/app/src/main/res/animator/animator_red_heart_colorfull.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/animator/animator_windmill.xml b/app/src/main/res/animator/animator_windmill.xml new file mode 100644 index 0000000..94000ce --- /dev/null +++ b/app/src/main/res/animator/animator_windmill.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/color/btn_selector.xml b/app/src/main/res/color/btn_selector.xml new file mode 100644 index 0000000..b683b24 --- /dev/null +++ b/app/src/main/res/color/btn_selector.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/android.png b/app/src/main/res/drawable-xxhdpi/android.png new file mode 100644 index 0000000..76fd681 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/android.png differ diff --git a/app/src/main/res/drawable-xxhdpi/balloon.png b/app/src/main/res/drawable-xxhdpi/balloon.png new file mode 100644 index 0000000..c8df3b3 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/balloon.png differ diff --git a/app/src/main/res/drawable-xxhdpi/classcsjz.png b/app/src/main/res/drawable-xxhdpi/classcsjz.png new file mode 100644 index 0000000..cb25f51 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/classcsjz.png differ diff --git a/app/src/main/res/drawable-xxhdpi/classcyzs.png b/app/src/main/res/drawable-xxhdpi/classcyzs.png new file mode 100644 index 0000000..076e961 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/classcyzs.png differ diff --git a/app/src/main/res/drawable-xxhdpi/classjdbs.png b/app/src/main/res/drawable-xxhdpi/classjdbs.png new file mode 100644 index 0000000..31b82ed Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/classjdbs.png differ diff --git a/app/src/main/res/drawable-xxhdpi/classjtcx.png b/app/src/main/res/drawable-xxhdpi/classjtcx.png new file mode 100644 index 0000000..3e2144c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/classjtcx.png differ diff --git a/app/src/main/res/drawable-xxhdpi/classjy.png b/app/src/main/res/drawable-xxhdpi/classjy.png new file mode 100644 index 0000000..30f02ab Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/classjy.png differ diff --git a/app/src/main/res/drawable-xxhdpi/classmzzj.png b/app/src/main/res/drawable-xxhdpi/classmzzj.png new file mode 100644 index 0000000..ff50989 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/classmzzj.png differ diff --git a/app/src/main/res/drawable-xxhdpi/classsbjy.png b/app/src/main/res/drawable-xxhdpi/classsbjy.png new file mode 100644 index 0000000..e0d235f Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/classsbjy.png differ diff --git a/app/src/main/res/drawable-xxhdpi/classwtyl.png b/app/src/main/res/drawable-xxhdpi/classwtyl.png new file mode 100644 index 0000000..5f34754 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/classwtyl.png differ diff --git a/app/src/main/res/drawable-xxhdpi/classylws.png b/app/src/main/res/drawable-xxhdpi/classylws.png new file mode 100644 index 0000000..543b5f8 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/classylws.png differ diff --git a/app/src/main/res/drawable-xxhdpi/gank.jpg b/app/src/main/res/drawable-xxhdpi/gank.jpg new file mode 100644 index 0000000..5c2d7fd Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/gank.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/hdelete.png b/app/src/main/res/drawable-xxhdpi/hdelete.png new file mode 100644 index 0000000..87fb744 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/hdelete.png differ diff --git a/app/src/main/res/drawable-xxhdpi/head.png b/app/src/main/res/drawable-xxhdpi/head.png new file mode 100644 index 0000000..e99291b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/head.png differ diff --git a/app/src/main/res/drawable-xxhdpi/home_11.png b/app/src/main/res/drawable-xxhdpi/home_11.png new file mode 100644 index 0000000..d142e67 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/home_11.png differ diff --git a/app/src/main/res/drawable-xxhdpi/image_banner.png b/app/src/main/res/drawable-xxhdpi/image_banner.png new file mode 100644 index 0000000..f2b8e2a Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/image_banner.png differ diff --git a/app/src/main/res/drawable-xxhdpi/loading.png b/app/src/main/res/drawable-xxhdpi/loading.png index e8ca483..13705f4 100644 Binary files a/app/src/main/res/drawable-xxhdpi/loading.png and b/app/src/main/res/drawable-xxhdpi/loading.png differ diff --git a/app/src/main/res/drawable-xxhdpi/loading_kunfu01.png b/app/src/main/res/drawable-xxhdpi/loading_kunfu01.png new file mode 100644 index 0000000..6f6f698 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/loading_kunfu01.png differ diff --git a/app/src/main/res/drawable-xxhdpi/loading_kunfu02.png b/app/src/main/res/drawable-xxhdpi/loading_kunfu02.png new file mode 100644 index 0000000..e7ef7f3 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/loading_kunfu02.png differ diff --git a/app/src/main/res/drawable-xxhdpi/loading_kunfu03.png b/app/src/main/res/drawable-xxhdpi/loading_kunfu03.png new file mode 100644 index 0000000..209b810 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/loading_kunfu03.png differ diff --git a/app/src/main/res/drawable-xxhdpi/loading_kunfu04.png b/app/src/main/res/drawable-xxhdpi/loading_kunfu04.png new file mode 100644 index 0000000..e003323 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/loading_kunfu04.png differ diff --git a/app/src/main/res/drawable-xxhdpi/loading_kunfu05.png b/app/src/main/res/drawable-xxhdpi/loading_kunfu05.png new file mode 100644 index 0000000..5f94abd Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/loading_kunfu05.png differ diff --git a/app/src/main/res/drawable-xxhdpi/loading_kunfu06.png b/app/src/main/res/drawable-xxhdpi/loading_kunfu06.png new file mode 100644 index 0000000..87c7d4f Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/loading_kunfu06.png differ diff --git a/app/src/main/res/drawable-xxhdpi/loading_kunfu07.png b/app/src/main/res/drawable-xxhdpi/loading_kunfu07.png new file mode 100644 index 0000000..f3d809d Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/loading_kunfu07.png differ diff --git a/app/src/main/res/drawable-xxhdpi/logo.png b/app/src/main/res/drawable-xxhdpi/logo.png deleted file mode 100644 index 226d800..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/logo.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/model01.jpg b/app/src/main/res/drawable-xxhdpi/model01.jpg new file mode 100644 index 0000000..74f556d Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/model01.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/model02.jpg b/app/src/main/res/drawable-xxhdpi/model02.jpg new file mode 100644 index 0000000..f8c3f39 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/model02.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/model03.jpg b/app/src/main/res/drawable-xxhdpi/model03.jpg new file mode 100644 index 0000000..281a67a Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/model03.jpg differ diff --git a/app/src/main/res/drawable-xxhdpi/motorcycle.png b/app/src/main/res/drawable-xxhdpi/motorcycle.png new file mode 100644 index 0000000..ef33988 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/motorcycle.png differ diff --git a/app/src/main/res/drawable-xxhdpi/titlebar_menu.png b/app/src/main/res/drawable-xxhdpi/titlebar_menu.png new file mode 100644 index 0000000..eda8f10 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/titlebar_menu.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/classcsjz.png b/app/src/main/res/drawable-xxxhdpi/classcsjz.png new file mode 100644 index 0000000..f588529 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/classcsjz.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/classcyzs.png b/app/src/main/res/drawable-xxxhdpi/classcyzs.png new file mode 100644 index 0000000..d78bc34 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/classcyzs.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/classjdbs.png b/app/src/main/res/drawable-xxxhdpi/classjdbs.png new file mode 100644 index 0000000..dfd2dd9 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/classjdbs.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/classjtcx.png b/app/src/main/res/drawable-xxxhdpi/classjtcx.png new file mode 100644 index 0000000..7d667a3 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/classjtcx.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/classjy.png b/app/src/main/res/drawable-xxxhdpi/classjy.png new file mode 100644 index 0000000..4937314 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/classjy.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/classmzzj.png b/app/src/main/res/drawable-xxxhdpi/classmzzj.png new file mode 100644 index 0000000..8842252 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/classmzzj.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/classsbjy.png b/app/src/main/res/drawable-xxxhdpi/classsbjy.png new file mode 100644 index 0000000..5555033 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/classsbjy.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/classwtyl.png b/app/src/main/res/drawable-xxxhdpi/classwtyl.png new file mode 100644 index 0000000..46f37a9 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/classwtyl.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/classylws.png b/app/src/main/res/drawable-xxxhdpi/classylws.png new file mode 100644 index 0000000..64b2cd3 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/classylws.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/gank.jpg b/app/src/main/res/drawable-xxxhdpi/gank.jpg new file mode 100644 index 0000000..5c2d7fd Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/gank.jpg differ diff --git a/app/src/main/res/drawable-xxxhdpi/image_banner.png b/app/src/main/res/drawable-xxxhdpi/image_banner.png new file mode 100644 index 0000000..f2b8e2a Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/image_banner.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/man.png b/app/src/main/res/drawable-xxxhdpi/man.png new file mode 100644 index 0000000..21a0188 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/man.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/women.png b/app/src/main/res/drawable-xxxhdpi/women.png new file mode 100644 index 0000000..0950017 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/women.png differ diff --git a/app/src/main/res/drawable/animated_android.xml b/app/src/main/res/drawable/animated_android.xml new file mode 100644 index 0000000..79e7fd3 --- /dev/null +++ b/app/src/main/res/drawable/animated_android.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/animated_astronaut.xml b/app/src/main/res/drawable/animated_astronaut.xml new file mode 100644 index 0000000..c269f0f --- /dev/null +++ b/app/src/main/res/drawable/animated_astronaut.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/animated_bonc.xml b/app/src/main/res/drawable/animated_bonc.xml new file mode 100644 index 0000000..b7ca47d --- /dev/null +++ b/app/src/main/res/drawable/animated_bonc.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/animated_face_to_happy.xml b/app/src/main/res/drawable/animated_face_to_happy.xml new file mode 100644 index 0000000..b436300 --- /dev/null +++ b/app/src/main/res/drawable/animated_face_to_happy.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/animated_face_to_sad.xml b/app/src/main/res/drawable/animated_face_to_sad.xml new file mode 100644 index 0000000..a2d2bc7 --- /dev/null +++ b/app/src/main/res/drawable/animated_face_to_sad.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/animated_fingerprint.xml b/app/src/main/res/drawable/animated_fingerprint.xml new file mode 100644 index 0000000..32dceff --- /dev/null +++ b/app/src/main/res/drawable/animated_fingerprint.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/animated_line_heart.xml b/app/src/main/res/drawable/animated_line_heart.xml new file mode 100644 index 0000000..2e82a15 --- /dev/null +++ b/app/src/main/res/drawable/animated_line_heart.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/animated_motorcycle_show.xml b/app/src/main/res/drawable/animated_motorcycle_show.xml new file mode 100644 index 0000000..1a58b51 --- /dev/null +++ b/app/src/main/res/drawable/animated_motorcycle_show.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/animated_red_heart_empty.xml b/app/src/main/res/drawable/animated_red_heart_empty.xml new file mode 100644 index 0000000..d6daa17 --- /dev/null +++ b/app/src/main/res/drawable/animated_red_heart_empty.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/animated_red_heart_full.xml b/app/src/main/res/drawable/animated_red_heart_full.xml new file mode 100644 index 0000000..b828947 --- /dev/null +++ b/app/src/main/res/drawable/animated_red_heart_full.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/animated_windmill.xml b/app/src/main/res/drawable/animated_windmill.xml new file mode 100644 index 0000000..c7d45a8 --- /dev/null +++ b/app/src/main/res/drawable/animated_windmill.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/btn_selector.xml b/app/src/main/res/drawable/btn_selector.xml new file mode 100644 index 0000000..bad98b9 --- /dev/null +++ b/app/src/main/res/drawable/btn_selector.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/kungfu_loading.xml b/app/src/main/res/drawable/kungfu_loading.xml new file mode 100644 index 0000000..90ba704 --- /dev/null +++ b/app/src/main/res/drawable/kungfu_loading.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/lift_on_touch.xml b/app/src/main/res/drawable/lift_on_touch.xml new file mode 100644 index 0000000..0cca544 --- /dev/null +++ b/app/src/main/res/drawable/lift_on_touch.xml @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ripple_one_item_bg.xml b/app/src/main/res/drawable/ripple_one_item_bg.xml new file mode 100644 index 0000000..fe5fad1 --- /dev/null +++ b/app/src/main/res/drawable/ripple_one_item_bg.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ripple_touch.xml b/app/src/main/res/drawable/ripple_touch.xml new file mode 100644 index 0000000..facdc29 --- /dev/null +++ b/app/src/main/res/drawable/ripple_touch.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ripple_touchborderless.xml b/app/src/main/res/drawable/ripple_touchborderless.xml new file mode 100644 index 0000000..893495c --- /dev/null +++ b/app/src/main/res/drawable/ripple_touchborderless.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_viewstate1.xml b/app/src/main/res/drawable/selector_viewstate1.xml new file mode 100644 index 0000000..1cd5502 --- /dev/null +++ b/app/src/main/res/drawable/selector_viewstate1.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_viewstate2.xml b/app/src/main/res/drawable/selector_viewstate2.xml new file mode 100644 index 0000000..1adafe6 --- /dev/null +++ b/app/src/main/res/drawable/selector_viewstate2.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_viewstate3.xml b/app/src/main/res/drawable/selector_viewstate3.xml new file mode 100644 index 0000000..85e5bdf --- /dev/null +++ b/app/src/main/res/drawable/selector_viewstate3.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_viewstate4.xml b/app/src/main/res/drawable/selector_viewstate4.xml new file mode 100644 index 0000000..380ec5f --- /dev/null +++ b/app/src/main/res/drawable/selector_viewstate4.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_viewstate5.xml b/app/src/main/res/drawable/selector_viewstate5.xml new file mode 100644 index 0000000..1939c6a --- /dev/null +++ b/app/src/main/res/drawable/selector_viewstate5.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_viewstate6.xml b/app/src/main/res/drawable/selector_viewstate6.xml new file mode 100644 index 0000000..b742c69 --- /dev/null +++ b/app/src/main/res/drawable/selector_viewstate6.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_background.xml b/app/src/main/res/drawable/shape_background.xml new file mode 100644 index 0000000..b5da9bd --- /dev/null +++ b/app/src/main/res/drawable/shape_background.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_line1.xml b/app/src/main/res/drawable/shape_line1.xml new file mode 100644 index 0000000..4fd8cc2 --- /dev/null +++ b/app/src/main/res/drawable/shape_line1.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_line2.xml b/app/src/main/res/drawable/shape_line2.xml new file mode 100644 index 0000000..2a5c7af --- /dev/null +++ b/app/src/main/res/drawable/shape_line2.xml @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_oval1.xml b/app/src/main/res/drawable/shape_oval1.xml new file mode 100644 index 0000000..027a58f --- /dev/null +++ b/app/src/main/res/drawable/shape_oval1.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_oval2.xml b/app/src/main/res/drawable/shape_oval2.xml new file mode 100644 index 0000000..75a325a --- /dev/null +++ b/app/src/main/res/drawable/shape_oval2.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_oval3.xml b/app/src/main/res/drawable/shape_oval3.xml new file mode 100644 index 0000000..69845e8 --- /dev/null +++ b/app/src/main/res/drawable/shape_oval3.xml @@ -0,0 +1,17 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_oval4.xml b/app/src/main/res/drawable/shape_oval4.xml new file mode 100644 index 0000000..806681e --- /dev/null +++ b/app/src/main/res/drawable/shape_oval4.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_oval5.xml b/app/src/main/res/drawable/shape_oval5.xml new file mode 100644 index 0000000..529463a --- /dev/null +++ b/app/src/main/res/drawable/shape_oval5.xml @@ -0,0 +1,21 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_oval6.xml b/app/src/main/res/drawable/shape_oval6.xml new file mode 100644 index 0000000..4966ecb --- /dev/null +++ b/app/src/main/res/drawable/shape_oval6.xml @@ -0,0 +1,20 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_rectangle1.xml b/app/src/main/res/drawable/shape_rectangle1.xml new file mode 100644 index 0000000..7054bec --- /dev/null +++ b/app/src/main/res/drawable/shape_rectangle1.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_rectangle2.xml b/app/src/main/res/drawable/shape_rectangle2.xml new file mode 100644 index 0000000..34686d8 --- /dev/null +++ b/app/src/main/res/drawable/shape_rectangle2.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_rectangle3.xml b/app/src/main/res/drawable/shape_rectangle3.xml new file mode 100644 index 0000000..f5364ed --- /dev/null +++ b/app/src/main/res/drawable/shape_rectangle3.xml @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_rectangle4.xml b/app/src/main/res/drawable/shape_rectangle4.xml new file mode 100644 index 0000000..144148d --- /dev/null +++ b/app/src/main/res/drawable/shape_rectangle4.xml @@ -0,0 +1,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_rectangle5.xml b/app/src/main/res/drawable/shape_rectangle5.xml new file mode 100644 index 0000000..01cc742 --- /dev/null +++ b/app/src/main/res/drawable/shape_rectangle5.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_rectangle6.xml b/app/src/main/res/drawable/shape_rectangle6.xml new file mode 100644 index 0000000..e5392f2 --- /dev/null +++ b/app/src/main/res/drawable/shape_rectangle6.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_rectangle7.xml b/app/src/main/res/drawable/shape_rectangle7.xml new file mode 100644 index 0000000..7d9bd45 --- /dev/null +++ b/app/src/main/res/drawable/shape_rectangle7.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_rectangle8.xml b/app/src/main/res/drawable/shape_rectangle8.xml new file mode 100644 index 0000000..7fabc77 --- /dev/null +++ b/app/src/main/res/drawable/shape_rectangle8.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_rectangle_selector_normal.xml b/app/src/main/res/drawable/shape_rectangle_selector_normal.xml new file mode 100644 index 0000000..1a75f14 --- /dev/null +++ b/app/src/main/res/drawable/shape_rectangle_selector_normal.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_rectangle_selector_press.xml b/app/src/main/res/drawable/shape_rectangle_selector_press.xml new file mode 100644 index 0000000..bc2b28b --- /dev/null +++ b/app/src/main/res/drawable/shape_rectangle_selector_press.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_ring1.xml b/app/src/main/res/drawable/shape_ring1.xml new file mode 100644 index 0000000..cc10226 --- /dev/null +++ b/app/src/main/res/drawable/shape_ring1.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_ring2.xml b/app/src/main/res/drawable/shape_ring2.xml new file mode 100644 index 0000000..6cf4ffe --- /dev/null +++ b/app/src/main/res/drawable/shape_ring2.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_ring3.xml b/app/src/main/res/drawable/shape_ring3.xml new file mode 100644 index 0000000..bac3f16 --- /dev/null +++ b/app/src/main/res/drawable/shape_ring3.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_ring4.xml b/app/src/main/res/drawable/shape_ring4.xml new file mode 100644 index 0000000..a1d1f22 --- /dev/null +++ b/app/src/main/res/drawable/shape_ring4.xml @@ -0,0 +1,14 @@ + + + + + + diff --git a/app/src/main/res/drawable/vector_android_blue_24dp.xml b/app/src/main/res/drawable/vector_android_blue_24dp.xml new file mode 100644 index 0000000..6db4360 --- /dev/null +++ b/app/src/main/res/drawable/vector_android_blue_24dp.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/app/src/main/res/drawable/vector_android_colortheme50_24dp.xml b/app/src/main/res/drawable/vector_android_colortheme50_24dp.xml new file mode 100644 index 0000000..4306c91 --- /dev/null +++ b/app/src/main/res/drawable/vector_android_colortheme50_24dp.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/app/src/main/res/drawable/vector_astronaut.xml b/app/src/main/res/drawable/vector_astronaut.xml new file mode 100644 index 0000000..8ad9244 --- /dev/null +++ b/app/src/main/res/drawable/vector_astronaut.xml @@ -0,0 +1,330 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/vector_bonc.xml b/app/src/main/res/drawable/vector_bonc.xml new file mode 100644 index 0000000..51c3326 --- /dev/null +++ b/app/src/main/res/drawable/vector_bonc.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/vector_fingerprint_24dp.xml b/app/src/main/res/drawable/vector_fingerprint_24dp.xml new file mode 100644 index 0000000..31a65d4 --- /dev/null +++ b/app/src/main/res/drawable/vector_fingerprint_24dp.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/vector_heart.xml b/app/src/main/res/drawable/vector_heart.xml new file mode 100644 index 0000000..bf33a33 --- /dev/null +++ b/app/src/main/res/drawable/vector_heart.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/vector_motorcycle_24dp.xml b/app/src/main/res/drawable/vector_motorcycle_24dp.xml new file mode 100644 index 0000000..ee27e14 --- /dev/null +++ b/app/src/main/res/drawable/vector_motorcycle_24dp.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/drawable/vector_music_greed_24dp.xml b/app/src/main/res/drawable/vector_music_greed_24dp.xml new file mode 100644 index 0000000..0564cd9 --- /dev/null +++ b/app/src/main/res/drawable/vector_music_greed_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/vector_person_colortheme50_24dp.xml b/app/src/main/res/drawable/vector_person_colortheme50_24dp.xml new file mode 100644 index 0000000..05e96aa --- /dev/null +++ b/app/src/main/res/drawable/vector_person_colortheme50_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/vector_red_heart.xml b/app/src/main/res/drawable/vector_red_heart.xml new file mode 100644 index 0000000..2ac09c5 --- /dev/null +++ b/app/src/main/res/drawable/vector_red_heart.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/vector_smile.xml b/app/src/main/res/drawable/vector_smile.xml new file mode 100644 index 0000000..9026f5d --- /dev/null +++ b/app/src/main/res/drawable/vector_smile.xml @@ -0,0 +1,28 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/vector_timer_colortheme50_24dp.xml b/app/src/main/res/drawable/vector_timer_colortheme50_24dp.xml new file mode 100644 index 0000000..a91fb68 --- /dev/null +++ b/app/src/main/res/drawable/vector_timer_colortheme50_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/vector_video_red_24dp.xml b/app/src/main/res/drawable/vector_video_red_24dp.xml new file mode 100644 index 0000000..2546fc4 --- /dev/null +++ b/app/src/main/res/drawable/vector_video_red_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/vector_windmill_24dp.xml b/app/src/main/res/drawable/vector_windmill_24dp.xml new file mode 100644 index 0000000..58fc217 --- /dev/null +++ b/app/src/main/res/drawable/vector_windmill_24dp.xml @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/app/src/main/res/layout/activity_animation_holder.xml b/app/src/main/res/layout/activity_animation_holder.xml new file mode 100644 index 0000000..73a70bf --- /dev/null +++ b/app/src/main/res/layout/activity_animation_holder.xml @@ -0,0 +1,40 @@ + + + + + + + +