依赖
// 侧滑菜单、TabLayout
implementation 'com.android.support:design:28.0.0'
// gson
implementation 'com.google.code.gson:gson:2.2.4'
//glide加载图片
implementation 'com.github.bumptech.glide:glide:4.9.0'
//xrecyclerview
implementation 'com.jcodecraeer:xrecyclerview:1.5.9'
//retrofit
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'//转换器,请求结果转换成Model
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'//配合Rxjava 使用
//Rxjava
implementation 'io.reactivex.rxjava2:rxjava:2.2.4'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
// 图片处理
implementation 'jp.wasabeef:glide-transformations:3.3.0'
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<com.jcodecraeer.xrecyclerview.XRecyclerView
android:id="@+id/xrv"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.jcodecraeer.xrecyclerview.XRecyclerView>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rl"
android:visibility="gone">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</android.support.v4.view.ViewPager>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="30dp"
android:orientation="horizontal"
android:layout_centerHorizontal="true">
<TextView
android:id="@+id/position"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="/"
android:textSize="30sp"/>
<TextView
android:id="@+id/size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"/>
</LinearLayout>
</RelativeLayout>
</LinearLayout>
ArticleBean(数据的bean类)
import java.util.List;
public class ArticleBean {
/**
* error : false
* results : [{"_id":"5c6a4ae99d212226776d3256","createdAt":"2019-02-18T06:04:25.571Z","desc":"2019-02-18","publishedAt":"2019-02-18T06:05:41.975Z","source":"web","type":"福利","url":"https://ws1.sinaimg.cn/large/0065oQSqly1g0ajj4h6ndj30sg11xdmj.jpg","used":true,"who":"lijinshanmx"},{"_id":"5c6385b39d21225dd7a417ce","createdAt":"2019-02-13T02:49:23.946Z","desc":"2019-02-13","publishedAt":"2019-02-13T02:49:33.16Z","source":"web","type":"福利","url":"https://ws1.sinaimg.cn/large/0065oQSqly1g04lsmmadlj31221vowz7.jpg","used":true,"who":"lijinshanmx"},{"_id":"5c4578db9d212264d4501d40","createdAt":"2019-01-21T07:46:35.304Z","desc":"2019-01-21","publishedAt":"2019-01-21T00:00:00.0Z","source":"web","type":"福利","url":"https://ws1.sinaimg.cn/large/0065oQSqgy1fze94uew3jj30qo10cdka.jpg","used":true,"who":"lijinshanmx"},{"_id":"5c2dabdb9d21226e068debf9","createdAt":"2019-01-03T06:29:47.895Z","desc":"2019-01-03","publishedAt":"2019-01-03T00:00:00.0Z","source":"web","type":"福利","url":"https://ws1.sinaimg.cn/large/0065oQSqly1fytdr77urlj30sg10najf.jpg","used":true,"who":"lijinshanmx"},{"_id":"5c25db189d21221e8ada8664","createdAt":"2018-12-28T08:13:12.688Z","desc":"2018-12-28","publishedAt":"2018-12-28T00:00:00.0Z","source":"web","type":"福利","url":"https://ws1.sinaimg.cn/large/0065oQSqly1fymj13tnjmj30r60zf79k.jpg","used":true,"who":"lijinshanmx"},{"_id":"5c12216d9d21223f5a2baea2","createdAt":"2018-12-13T09:07:57.2Z","desc":"2018-12-13","publishedAt":"2018-12-13T00:00:00.0Z","source":"web","type":"福利","url":"https://ws1.sinaimg.cn/large/0065oQSqgy1fy58bi1wlgj30sg10hguu.jpg","used":true,"who":"lijinshanmx"},{"_id":"5bfe1a5b9d2122309624cbb7","createdAt":"2018-11-28T04:32:27.338Z","desc":"2018-11-28","publishedAt":"2018-11-28T00:00:00.0Z","source":"web","type":"福利","url":"https://ws1.sinaimg.cn/large/0065oQSqgy1fxno2dvxusj30sf10nqcm.jpg","used":true,"who":"lijinshanmx"},{"_id":"5bf22fd69d21223ddba8ca25","createdAt":"2018-11-19T03:36:54.950Z","desc":"2018-11-19","publishedAt":"2018-11-19T00:00:00.0Z","source":"web","type":"福利","url":"https://ws1.sinaimg.cn/large/0065oQSqgy1fxd7vcz86nj30qo0ybqc1.jpg","used":true,"who":"lijinshanmx"},{"_id":"5be14edb9d21223dd50660f8","createdAt":"2018-11-06T08:20:43.656Z","desc":"2018-11-06","publishedAt":"2018-11-06T00:00:00.0Z","source":"web","type":"福利","url":"https://ws1.sinaimg.cn/large/0065oQSqgy1fwyf0wr8hhj30ie0nhq6p.jpg","used":true,"who":"lijinshanmx"},{"_id":"5bcd71979d21220315c663fc","createdAt":"2018-10-22T06:43:35.440Z","desc":"2018-10-22","publishedAt":"2018-10-22T00:00:00.0Z","source":"web","type":"福利","url":"https://ws1.sinaimg.cn/large/0065oQSqgy1fwgzx8n1syj30sg15h7ew.jpg","used":true,"who":"lijinshanmx"},{"_id":"5bc434ac9d212279160c4c9e","createdAt":"2018-10-15T06:33:16.497Z","desc":"2018-10-15","publishedAt":"2018-10-15T00:00:00.0Z","source":"web","type":"福利","url":"https://ws1.sinaimg.cn/large/0065oQSqly1fw8wzdua6rj30sg0yc7gp.jpg","used":true,"who":"lijinshanmx"},{"_id":"5bbb0de09d21226111b86f1c","createdAt":"2018-10-08T07:57:20.978Z","desc":"2018-10-08","publishedAt":"2018-10-08T00:00:00.0Z","source":"web","type":"福利","url":"https://ws1.sinaimg.cn/large/0065oQSqly1fw0vdlg6xcj30j60mzdk7.jpg","used":true,"who":"lijinshanmx"},{"_id":"5ba206ec9d2122610aba3440","createdAt":"2018-09-19T08:21:00.295Z","desc":"2018-09-19","publishedAt":"2018-09-19T00:00:00.0Z","source":"web","type":"福利","url":"https://ws1.sinaimg.cn/large/0065oQSqly1fvexaq313uj30qo0wldr4.jpg","used":true,"who":"lijinshanmx"},{"_id":"5b9771a29d212206c1b383d0","createdAt":"2018-09-11T07:41:22.491Z","desc":"2018-09-11","publishedAt":"2018-09-11T00:00:00.0Z","source":"web","type":"福利","url":"https://ws1.sinaimg.cn/large/0065oQSqly1fv5n6daacqj30sg10f1dw.jpg","used":true,"who":"lijinshanmx"},{"_id":"5b830bba9d2122031f86ee51","createdAt":"2018-08-27T04:21:14.703Z","desc":"2018-08-27","publishedAt":"2018-08-28T00:00:00.0Z","source":"web","type":"福利","url":"https://ws1.sinaimg.cn/large/0065oQSqly1fuo54a6p0uj30sg0zdqnf.jpg","used":true,"who":"lijinshanmx"},{"_id":"5b7b836c9d212201e982de6e","createdAt":"2018-08-21T11:13:48.989Z","desc":"2018-08-21","publishedAt":"2018-08-21T00:00:00.0Z","source":"web","type":"福利","url":"https://ws1.sinaimg.cn/large/0065oQSqly1fuh5fsvlqcj30sg10onjk.jpg","used":true,"who":"lijinshanmx"},{"_id":"5b74e9409d21222c52ae4cb4","createdAt":"2018-08-16T11:02:24.289Z","desc":"2018-08-16","publishedAt":"2018-08-16T00:00:00.0Z","source":"api","type":"福利","url":"https://ws1.sinaimg.cn/large/0065oQSqly1fubd0blrbuj30ia0qp0yi.jpg","used":true,"who":"lijinshan"},{"_id":"5b7102749d2122341d563844","createdAt":"2018-08-13T12:00:52.458Z","desc":"2018-08-13","publishedAt":"2018-08-13T00:00:00.0Z","source":"api","type":"福利","url":"https://ww1.sinaimg.cn/large/0065oQSqly1fu7xueh1gbj30hs0uwtgb.jpg","used":true,"who":"lijinshan"},{"_id":"5b6bad449d21226f45755582","createdAt":"2018-08-09T10:56:04.962Z","desc":"2018-08-09","publishedAt":"2018-08-09T00:00:00.0Z","source":"web","type":"福利","url":"https://ww1.sinaimg.cn/large/0065oQSqgy1fu39hosiwoj30j60qyq96.jpg","used":true,"who":"lijinshanmx"},{"_id":"5b67b7fd9d2122195bdbd806","createdAt":"2018-08-06T10:52:45.809Z","desc":"2018-08-06","publishedAt":"2018-08-06T00:00:00.0Z","source":"api","type":"福利","url":"https://ww1.sinaimg.cn/large/0065oQSqly1ftzsj15hgvj30sg15hkbw.jpg","used":true,"who":"lijinshan"}]
*/
private boolean error;
private List<ResultsBean> results;
public boolean isError() {
return error;
}
public void setError(boolean error) {
this.error = error;
}
public List<ResultsBean> getResults() {
return results;
}
public void setResults(List<ResultsBean> results) {
this.results = results;
}
public static class ResultsBean {
/**
* _id : 5c6a4ae99d212226776d3256
* createdAt : 2019-02-18T06:04:25.571Z
* desc : 2019-02-18
* publishedAt : 2019-02-18T06:05:41.975Z
* source : web
* type : 福利
* url : https://ws1.sinaimg.cn/large/0065oQSqly1g0ajj4h6ndj30sg11xdmj.jpg
* used : true
* who : lijinshanmx
*/
private String _id;
private String createdAt;
private String desc;
private String publishedAt;
private String source;
private String type;
private String url;
private boolean used;
private String who;
//宽高比
private float scale;
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
public String getCreatedAt() {
return createdAt;
}
public void setCreatedAt(String createdAt) {
this.createdAt = createdAt;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getPublishedAt() {
return publishedAt;
}
public void setPublishedAt(String publishedAt) {
this.publishedAt = publishedAt;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public boolean isUsed() {
return used;
}
public void setUsed(boolean used) {
this.used = used;
}
public String getWho() {
return who;
}
public void setWho(String who) {
this.who = who;
}
public float getScale() {
return scale;
}
public void setScale(float scale) {
this.scale = scale;
}
}
}
HttpService
import com.example.exam.bean.ArticleBean;
import io.reactivex.Observable;
import retrofit2.http.GET;
import retrofit2.http.Path;
public interface HttpService {
String url="http://gank.io/api/data/%E7%A6%8F%E5%88%A9/20/";
@GET("{page}")
Observable<ArticleBean> getData(@Path("page") int page);
}
Activity
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.example.exam.adapter.MyViewPagerAdapter;
import com.example.exam.adapter.MyXRecyclerViewAdapter;
import com.example.exam.bean.ArticleBean;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
int page = 1;
int newPosition = 0;
private XRecyclerView xrv;
private ViewPager viewpager;
private ArrayList<ArticleBean.ResultsBean> xrvList;
private MyXRecyclerViewAdapter myXRecyclerViewAdapter;
private TextView position;
private TextView size;
private RelativeLayout rl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
// 加载数据
initData();
}
private void initView() {
xrv = (XRecyclerView) findViewById(R.id.xrv);
viewpager = (ViewPager) findViewById(R.id.viewpager);
position = (TextView) findViewById(R.id.position);
size = (TextView) findViewById(R.id.size);
rl = (RelativeLayout) findViewById(R.id.rl);
// 设置布局使用瀑布流
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
xrv.setLayoutManager(layoutManager);
// 下拉刷新,上拉加载
xrv.setLoadingListener(new XRecyclerView.LoadingListener() {
@Override
public void onRefresh() {
page = 1;
xrvList.clear();
initData();
}
@Override
public void onLoadMore() {
page++;
initData();
}
});
xrvList = new ArrayList<>();
myXRecyclerViewAdapter = new MyXRecyclerViewAdapter(xrvList, MainActivity.this);
xrv.setAdapter(myXRecyclerViewAdapter);
// item条目的点击监听
myXRecyclerViewAdapter.setOnItemClickListener(new MyXRecyclerViewAdapter.OnItemClickListener() {
@Override
public void onItemClick(int p, String url) {
xrv.setVisibility(View.GONE);
rl.setVisibility(View.VISIBLE);
ArrayList<ImageView> imageViews = new ArrayList<>();
for (int i = 0; i < xrvList.size(); i++) {
ImageView imageView = new ImageView(MainActivity.this);
Glide.with(MainActivity.this).load(xrvList.get(i).getUrl()).into(imageView);
imageViews.add(imageView);
}
// Viewpager下方显示当前页面值,和总页面值
position.setText(p + 1 + "");
size.setText(xrvList.size() + "");
MyViewPagerAdapter myViewPagerAdapter = new MyViewPagerAdapter(imageViews);
viewpager.setAdapter(myViewPagerAdapter);
// 设置Viewpager默认显示点击的那个图片
viewpager.setCurrentItem(p);
// Viewpager滑动监听,改变Viewpager下方的数值
viewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i1) {
}
@Override
public void onPageSelected(int i) {
position.setText(i +1+ "");
}
@Override
public void onPageScrollStateChanged(int i) {
}
});
}
});
}
private void initData() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(HttpService.url)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
HttpService httpService = retrofit.create(HttpService.class);
httpService.getData(page)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ArticleBean>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ArticleBean articleBean) {
myXRecyclerViewAdapter.setData(articleBean);
myXRecyclerViewAdapter.notifyDataSetChanged();
xrv.refreshComplete();
xrv.loadMoreComplete();
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " + e.getMessage());
}
@Override
public void onComplete() {
}
});
}
// 双击返回键退出应用
private long firstTime = 0;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
if ((System.currentTimeMillis() - firstTime) > 1000) {
Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
firstTime = System.currentTimeMillis();
xrv.setVisibility(View.VISIBLE);
rl.setVisibility(View.GONE);
} else {
finish();
System.exit(0);
}
return true;
}
return super.onKeyDown(keyCode, event);
}
}
adapter
XRecyclerViewAdapter
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
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 com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.transition.Transition;
import com.example.exam.MyApplication;
import com.example.exam.R;
import com.example.exam.SystemUtil;
import com.example.exam.bean.ArticleBean;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.annotations.Nullable;
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
public class MyXRecyclerViewAdapter extends RecyclerView.Adapter<MyXRecyclerViewAdapter.ViewHolder> {
private ArrayList<ArticleBean.ResultsBean> xrvList;
Context context;
public MyXRecyclerViewAdapter(ArrayList<ArticleBean.ResultsBean> xrvList, Context context) {
this.xrvList = xrvList;
this.context = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item, null);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
final ArticleBean.ResultsBean resultsBean = xrvList.get(position);
//设置图片之前需要重新设置ImageView的宽高
// imageWidth 根据屏幕的宽算出图片的宽
int imageWidth = MyApplication.mWidthPixels / 2 - SystemUtil.dp2px(8);
// LinearLayout.LayoutParams 适配器的item条目的最外层布局是什么LayoutParams前面就是什么
// layoutParams 可以得到图片的宽高
LinearLayout.LayoutParams layoutParams =
(LinearLayout.LayoutParams) holder.url.getLayoutParams();
// 图片的宽
layoutParams.width = imageWidth;
if (resultsBean.getScale()!=0){
layoutParams.height = (int) (imageWidth/resultsBean.getScale());
}
layoutParams.leftMargin = layoutParams.topMargin = SystemUtil.dp2px(4);
holder.url.setLayoutParams(layoutParams);
// 给图片设置圆角
// 这种方式除了Glide依赖还需要再添加一个依赖
// implementation 'jp.wasabeef:glide-transformations:3.3.0' // 图片处理
RequestOptions options = new RequestOptions().transform(new RoundedCornersTransformation(SystemUtil.dp2px(6), 0));
Glide.with(context).load(resultsBean.getUrl()).apply(options).into(holder.url);
/**
* 设置圆角的第二种方式
* RoundedCorners roundedCorners = new RoundedCorners(20);
* RequestOptions requestOptions = RequestOptions.bitmapTransform(roundedCorners);
*/
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onItemClickListener!=null){
onItemClickListener.onItemClick(position,resultsBean.getUrl());
}
}
});
}
@Override
public int getItemCount() {
return xrvList.size();
}
public void setData(ArticleBean articleBean) {
List<ArticleBean.ResultsBean> results = articleBean.getResults();
xrvList.addAll(results);
setImageScale();
}
//计算图片的宽高比
private void setImageScale() {
for (final ArticleBean.ResultsBean bean : xrvList) {
if (bean.getScale() == 0) {
Glide.with(context).load(bean.getUrl()).into(
new SimpleTarget<Drawable>() {
@Override
public void onResourceReady(@NonNull Drawable resource,
@Nullable Transition<? super Drawable> transition) {
//宽高比
float scale = resource.getIntrinsicWidth() * 1.0f / resource.getIntrinsicHeight();
bean.setScale(scale);
notifyDataSetChanged();
}
});
} else {
notifyDataSetChanged();
}
}
}
public class ViewHolder extends RecyclerView.ViewHolder {
private ImageView url;
public ViewHolder(View itemView) {
super(itemView);
url=itemView.findViewById(R.id.url);
}
}
OnItemClickListener onItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
public interface OnItemClickListener{
void onItemClick(int position,String url);
}
}
ViewPagerAdapter
import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import java.util.ArrayList;
public class MyViewPagerAdapter extends PagerAdapter{
ArrayList<ImageView> imageViews;
public MyViewPagerAdapter(ArrayList<ImageView> imageViews) {
this.imageViews = imageViews;
}
@Override
public int getCount() {
return imageViews.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
return view==o;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
container.addView(imageViews.get(position));
return imageViews.get(position);
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView(imageViews.get(position));
}
}
MyApplication
import android.app.Application;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.WindowManager;
public class MyApplication extends Application {
private static MyApplication myApplication;
public static int mWidthPixels;
public static int mHeightPixels;
@Override
public void onCreate() {
super.onCreate();
myApplication = this;
getScreenWH();
}
//计算屏幕宽高
private void getScreenWH() {
WindowManager manager = (WindowManager) getSystemService(WINDOW_SERVICE);
Display defaultDisplay = manager.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
defaultDisplay.getMetrics(metrics);
mWidthPixels = metrics.widthPixels;
mHeightPixels = metrics.heightPixels;
}
public static MyApplication getMyApplication() {
return myApplication;
}
}
Constants 接口
import android.os.Environment;
import java.io.File;
public interface Constants {
boolean isDebug = true;
String PATH_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath() +
File.separator + "codeest" + File.separator + "GeekNews";
String FILE_PROVIDER_AUTHORITY="com.baidu.geek.fileprovider";
//网络缓存的地址
String PATH_DATA = MyApplication.getMyApplication().getCacheDir().getAbsolutePath() +
File.separator + "data";
String PATH_CACHE = PATH_DATA + "/NetCache";
String DATA = "data";
//夜间模式
String MODE = "mode";
String NIGHT_CURRENT_FRAG_POS = "fragment_pos";
String DATE="date";
}
SystemUtil(工具类)
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import android.support.v4.content.FileProvider;
import android.text.TextUtils;
import android.view.View;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
public class SystemUtil {
/**
* 检查WIFI是否连接
*/
public static boolean isWifiConnected() {
ConnectivityManager connectivityManager = (ConnectivityManager) MyApplication.getMyApplication().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifiInfo = connectivityManager
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return wifiInfo != null;
}
/**
* 检查手机网络(4G/3G/2G)是否连接
*/
public static boolean isMobileNetworkConnected() {
ConnectivityManager connectivityManager = (ConnectivityManager) MyApplication.getMyApplication().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobileNetworkInfo = connectivityManager
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
return mobileNetworkInfo != null;
}
/**
* 检查是否有可用网络
*/
public static boolean isNetworkConnected() {
ConnectivityManager connectivityManager = (ConnectivityManager) MyApplication.getMyApplication().getSystemService(Context.CONNECTIVITY_SERVICE);
return connectivityManager.getActiveNetworkInfo() != null;
}
/**
* 保存文字到剪贴板
* @param context
* @param text
*/
public static void copyToClipBoard(Context context, String text) {
ClipData clipData = ClipData.newPlainText("url", text);
ClipboardManager manager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
manager.setPrimaryClip(clipData);
Toast.makeText(context,"已复制到剪贴板",Toast.LENGTH_SHORT).show();
}
/**
* 保存图片到本地
* @param context
* @param url
* @param bitmap
*/
public static Uri saveBitmapToFile(Context context, String url, Bitmap bitmap,
View container, boolean isShare){
String fileName = url.substring(url.lastIndexOf("/"),url.lastIndexOf(".")) + ".png";
File fileDir = new File(Constants.PATH_SDCARD);
if (!fileDir.exists()){
fileDir.mkdirs();
}
File imageFile = new File(fileDir,fileName);
Uri uri = Uri.fromFile(imageFile);
if (isShare && imageFile.exists()) {
if (Build.VERSION.SDK_INT >= 24) {
uri = FileProvider.getUriForFile(context.getApplicationContext(),
Constants.FILE_PROVIDER_AUTHORITY, imageFile);
}
return uri;
}
try {
FileOutputStream fos = new FileOutputStream(imageFile);
boolean isCompress = bitmap.compress(Bitmap.CompressFormat.PNG, 90, fos);
if (isCompress) {
ToastUtil.showShort("保存妹纸成功n(*≧▽≦*)n");
} else {
ToastUtil.showShort("保存妹纸失败ヽ(≧Д≦)ノ");
}
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
ToastUtil.showShort("保存妹纸失败ヽ(≧Д≦)ノ");
}
try {
MediaStore.Images.Media.insertImage(context.getContentResolver(), imageFile.getAbsolutePath(), fileName, null);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,uri));
if (Build.VERSION.SDK_INT >= 24) {
uri = FileProvider.getUriForFile(context.getApplicationContext(),
Constants.FILE_PROVIDER_AUTHORITY, imageFile);
}
return uri;
}
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dp2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
public static int dp2px(float dpValue) {
final float scale = MyApplication.getMyApplication().getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dp(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
public static int px2dp(float pxValue) {
final float scale = MyApplication.getMyApplication().getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* 获取进程号对应的进程名
*
* @param pid 进程号
* @return 进程名
*/
public static String getProcessName(int pid) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("/proc/" + pid + "/cmdline"));
String processName = reader.readLine();
if (!TextUtils.isEmpty(processName)) {
processName = processName.trim();
}
return processName;
} catch (Throwable throwable) {
throwable.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException exception) {
exception.printStackTrace();
}
}
return null;
}
}
ToastUtil(工具类)
import android.widget.Toast;
public class ToastUtil {
public static void showShort(String msg){
//避免内存泄漏的一个方法,用到上下文的地方,能用application的就application
Toast.makeText(MyApplication.getMyApplication(),msg,Toast.LENGTH_SHORT).show();
}
public static void showLong(String msg){
//避免内存泄漏的一个方法,用到上下文的地方,能用application的就application
Toast.makeText(MyApplication.getMyApplication(),msg,Toast.LENGTH_LONG).show();
}
}
网友评论