private void initEvents() {
// 更新下标
mPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int arg0) {
CharSequence text = getString(R.string.viewpager_indicator, arg0 + 1, mPager.getAdapter().getCount());
indicator.setText(text);
}
});
mPager.setCurrentItem(pagerPosition);
}
private class ImagePagerAdapter extends FragmentStatePagerAdapter {
public ArrayList<String> urlArrays;
public ImagePagerAdapter(FragmentManager fm, ArrayList<String> urlArrays) {
super(fm);
this.urlArrays = urlArrays;
}
@Override
public int getCount() {
return urlArrays == null ? 0 : urlArrays.size();
}
@Override
public Fragment getItem(int position) {
String url = urlArrays.get(position);
return ImageDetailFragment.newInstance(url);
}
}
}
### 3、两个工具类:
public class ImageDetailFragment extends Fragment {
private static final String TAG = "ImageDetailFragment";
private String mImageUrl;
private View rootView;
private PhotoView mImageView;
private ProgressBar progressBar;
private TextView baocunte;
private PhotoViewAttacher mAttacher;
private String SAVE_PIC_PATH = Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)
? Environment.getExternalStorageDirectory().getAbsolutePath() : "/mnt/sdcard";//
private String SAVE_REAL_PATH = SAVE_PIC_PATH + "/good/savePic";//保存的确
Bitmap bitmap;
public static ImageDetailFragment newInstance(String imageUrl) {
final ImageDetailFragment f = new ImageDetailFragment();
final Bundle args = new Bundle();
args.putString("url", imageUrl);
f.setArguments(args);
return f;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mImageUrl = getArguments() != null ? getArguments().getString("url") : null;
new Thread(runnable).start();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// return super.onCreateView(inflater, container, savedInstanceState);
if (rootView == null) {
rootView = inflater.inflate(R.layout.image_xinshi_detail_fragment, container, false);
mImageView = (PhotoView) rootView.findViewById(R.id.image);
progressBar = (ProgressBar) rootView.findViewById(R.id.loading);
baocunte =(TextView)rootView.findViewById(R.id.baochunte);
Log.e(TAG, "onCreateView:---------------- ");
}else {
ViewGroup parent = (ViewGroup) rootView.getParent();
if (parent != null) {
parent.removeView(rootView);
}
}
return rootView;
}
/* 策略解说:
all:缓存源资源和转换后的资源
none:不作任何磁盘缓存
source:缓存源资源
result:缓存转换后的资源*/
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
progressBar.setVisibility(View.VISIBLE);
Glide.with(ImageDetailFragment.this).load(mImageUrl).placeholder(R.mipmap.icon_defaultimg) // 占位图
.error(R.mipmap.icon_errorimg)
.diskCacheStrategy(DiskCacheStrategy.RESULT)//图片缓存模式
.listener(new GlideRequestListener()).into(mImageView);
}
//glide 请求的回调
private class GlideRequestListener implements RequestListener {
@Override
public boolean onException(Exception e, Object model, Target target, boolean isFirstResource) {
Toast.makeText(getActivity(), "加载图片失败", Toast.LENGTH_SHORT).show();
progressBar.setVisibility(View.GONE);
return false;
}
//这个用于监听图片是否加载完成
@Override
public boolean onResourceReady(Object resource, Object model, Target target, boolean isFromMemoryCache, boolean isFirstResource) {
mAttacher = new PhotoViewAttacher(mImageView);
mAttacher.setOnPhotoTapListener(new OnPhotoTapListener() {
@Override
public void onPhotoTap(ImageView view, float x, float y) {
getActivity().finish();
}
});
mAttacher.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Log.i("Lgq","...... "+mImageUrl);
showNormalDialogOne();
Toast.makeText(getActivity(), "触发长按事件", Toast.LENGTH_SHORT).show();
return false;
}
});
baocunte.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
saveFile(bitmap, System.currentTimeMillis() + ".jpg");
} catch (IOException e) {
e.printStackTrace();
}
}
});
progressBar.setVisibility(View.GONE);
return false;
}
}
private void saveFile(Bitmap bm, String fileName) throws IOException {
String subForder = SAVE_REAL_PATH;
File foder = new File(subForder);
if (!foder.exists()) foder.mkdirs();
File myCaptureFile = new File(subForder, fileName);
Log.v("lgq","图片保持。。。。。。。。"+myCaptureFile);
Log.v("lgq","图片保持。。。。。getPath。。。"+myCaptureFile.getPath());
if (!myCaptureFile.exists()) myCaptureFile.createNewFile();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);
bos.flush();
bos.close();
Toast.makeText(getContext(),"已保存在/good/savePic目录下", Toast.LENGTH_SHORT).show();
//发送广播通知系统
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri uri = Uri.fromFile(myCaptureFile);
intent.setData(uri);
getActivity().sendBroadcast(intent);
}
@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 1) {
}
}
};
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
bitmap = ((BitmapDrawable) loadImageFromUrl(mImageUrl)).getBitmap();
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
};
private static Drawable loadImageFromUrl(String url) throws IOException {
URL m = new URL(url);
InputStream i = (InputStream) m.getContent();
return Drawable.createFromStream(i, "src");
}
private void showNormalDialogOne() {
/* @setIcon 设置对话框图标
* @setTitle 设置对话框标题
* @setMessage 设置对话框消息提示
* setXXX方法返回Dialog对象,因此可以链式设置属性
总结
本文讲解了我对Android开发现状的一些看法,也许有些人会觉得我的观点不对,但我认为没有绝对的对与错,一切交给时间去证明吧!愿与各位坚守的同胞们互相学习,共同进步!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!