本博客仅是个人想整理一下最近一段时间经常使用的功能类和方法,没有任何功能逻辑可言。
1、轮播
/**
* 广告图片自动轮播控件</br>
*
* <pre>
* 集合ViewPager和指示器的一个轮播控件,主要用于一般常见的广告图片轮播,具有自动轮播和手动轮播功能
* 使用:只需在xml文件中使用{@code <com.minking.imagecycleview.ImageCycleView/>} ,
* 然后在页面中调用 {@link #setImageResources(ArrayList, ImageCycleViewListener) }即可!
*
* 另外提供{@link #startImageCycle() } \ {@link #pushImageCycle() }两种方法,用于在Activity不可见之时节省资源;
* 因为自动轮播需要进行控制,有利于内存管理
* </pre>
*
*/
public class ImageCycleView extends LinearLayout {
/**
* 上下文
*/
private Context mContext;
/**
* 图片轮播视图
*/
private CycleViewPager mBannerPager = null;
/**
* 滚动图片视图适配器
*/
private ImageCycleAdapter mAdvAdapter;
/**
* 图片轮播指示器控件
*/
private ViewGroup mGroup;
/**
* 图片轮播指示器-个图
*/
private ImageView mImageView = null;
/**
* 滚动图片指示器-视图列表
*/
private ImageView[] mImageViews = null;
/**
* 图片滚动当前图片下标
*/
private int mImageIndex = 1;
/**
* 手机密度
*/
private float mScale;
/**
* @param context
*/
public ImageCycleView(Context context) {
super(context);
}
/**
* @param context
* @param attrs
*/
public ImageCycleView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
mScale = context.getResources().getDisplayMetrics().density;
LayoutInflater.from(context).inflate(R.layout.view_banner_content, this);
mBannerPager = (CycleViewPager) findViewById(R.id.pager_banner);
mBannerPager.setOnPageChangeListener(new GuidePageChangeListener());
mBannerPager.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
// 开始图片滚动
startImageTimerTask();
break;
default:
// 停止图片滚动
stopImageTimerTask();
break;
}
return false;
}
});
// 滚动图片右下指示器视图
mGroup = (ViewGroup) findViewById(R.id.viewGroup);
}
/**
* 装填图片数据
*
* @param imageCycleViewListener
*/
public void setImageResources(ArrayList<StationDetailBean.DataBean.StationImageBean> infoList, ImageCycleViewListener imageCycleViewListener) {
// 清除所有子视图
mGroup.removeAllViews();
// 图片广告数量
final int imageCount = infoList.size();
mImageViews = new ImageView[imageCount];
for (int i = 0; i < imageCount; i++) {
mImageView = new ImageView(mContext);
// int imageParams = (int) (mScale * 20 + 0.5f);// XP与DP转换,适应不同分辨率
// int imagePadding = (int) (mScale * 5 + 0.5f);
LayoutParams layout = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
layout.setMargins(8, 0, 8, 0);
mImageView.setLayoutParams(layout);
//mImageView.setPadding(imagePadding, imagePadding, imagePadding, imagePadding);
mImageViews[i] = mImageView;
if (i == 0) {
mImageViews[i].setImageResource(R.drawable.dots2);
} else {
mImageViews[i].setImageResource(R.drawable.dots1);
}
mGroup.addView(mImageViews[i]);
}
mAdvAdapter = new ImageCycleAdapter(mContext, infoList, imageCycleViewListener);
mBannerPager.setAdapter(mAdvAdapter);
startImageTimerTask();
}
/**
* 开始轮播(手动控制自动轮播与否,便于资源控制)
*/
public void startImageCycle() {
startImageTimerTask();
}
/**
* 暂停轮播——用于节省资源
*/
public void pushImageCycle() {
stopImageTimerTask();
}
/**
* 开始图片滚动任务
*/
private void startImageTimerTask() {
stopImageTimerTask();
// 图片每3秒滚动一次
mHandler.postDelayed(mImageTimerTask, 3000);
}
/**
* 停止图片滚动任务
*/
private void stopImageTimerTask() {
mHandler.removeCallbacks(mImageTimerTask);
}
private Handler mHandler = new Handler();
/**
* 图片自动轮播Task
*/
private Runnable mImageTimerTask = new Runnable() {
@Override
public void run() {
if (mImageViews != null) {
// 下标等于图片列表长度说明已滚动到最后一张图片,重置下标
if ((++mImageIndex) == mImageViews.length + 1) {
mImageIndex = 1;
}
mBannerPager.setCurrentItem(mImageIndex);
}
}
};
/**
* 轮播图片状态监听器
*
* @author minking
*/
private final class GuidePageChangeListener implements OnPageChangeListener {
@Override
public void onPageScrollStateChanged(int state) {
if (state == ViewPager.SCROLL_STATE_IDLE)
startImageTimerTask(); // 开始下次计时
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int index) {
if (index == 0 || index == mImageViews.length + 1) {
return;
}
// 设置图片滚动指示器背景
mImageIndex = index;
index -= 1;
mImageViews[index].setImageResource(R.drawable.dots2);
for (int i = 0; i < mImageViews.length; i++) {
if (index != i) {
mImageViews[i].setImageResource(R.drawable.dots1);
}
}
}
}
private class ImageCycleAdapter extends PagerAdapter {
/**
* 图片视图缓存列表
*/
// private ArrayList<ImageView> mImageViewCacheList;
/**
* 图片资源列表
*/
private ArrayList<StationDetailBean.DataBean.StationImageBean> mAdList = new ArrayList<StationDetailBean.DataBean.StationImageBean>();
/**
* 广告图片点击监听器
*/
private ImageCycleViewListener mImageCycleViewListener;
private Context mContext;
public ImageCycleAdapter(Context context, ArrayList<StationDetailBean.DataBean.StationImageBean> adList, ImageCycleViewListener imageCycleViewListener) {
mContext = context;
mAdList = adList;
mImageCycleViewListener = imageCycleViewListener;
// mImageViewCacheList = new ArrayList<>();
}
@Override
public int getCount() {
return mAdList.size();
}
@Override
public boolean isViewFromObject(View view, Object obj) {
return view == obj;
}
@Override
public Object instantiateItem(ViewGroup container, final int position) {
String imageUrl = mAdList.get(position).getSmallImage();
View view = LayoutInflater.from(mContext).inflate(R.layout.banner_cardimg, null);
// MyShadowLayout msl_v=view.findViewById(R.id.msl_v);
ImageView imageView = null;
imageView = (ImageView) view.findViewById(R.id.iv_banner_cardpic);
// 设置图片点击监听
imageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mImageCycleViewListener.onImageClick(mAdList.get(position).getAttPath(),position, v);
}
});
container.addView(view);
mImageCycleViewListener.displayImage(imageUrl, imageView);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
View view = (View) object;
container.removeView(view);
// mImageViewCacheList.add(view);
}
}
/**
* 轮播控件的监听事件
*
* @author minking
*/
public static interface ImageCycleViewListener {
/**
* 加载图片资源
*
* @param imageURL
* @param imageView
*/
public void displayImage(String imageURL, ImageView imageView);
/**
* 单击图片事件
*
* @param imageView
*/
public void onImageClick(String info, int postion, View imageView);
}
}
轮播XML布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.xh.emcar.view.CycleViewPager
android:id="@+id/pager_banner"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</com.xh.emcar.view.CycleViewPager>
<LinearLayout
android:id="@+id/viewGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="10dp"
android:gravity="center_horizontal"
android:orientation="horizontal" >
</LinearLayout>
</RelativeLayout>
CycleViewPager:
public class CycleViewPager extends ViewPager {
private InnerPagerAdapter mAdapter;
public CycleViewPager(Context context) {
super( context);
setOnPageChangeListener( null);
}
public CycleViewPager(Context context, AttributeSet attrs) {
super( context, attrs);
setOnPageChangeListener( null);
}
@Override
public void setAdapter(PagerAdapter arg0) {
mAdapter = new InnerPagerAdapter( arg0);
super.setAdapter( mAdapter);
setCurrentItem(1);
}
@Override
public void setOnPageChangeListener(OnPageChangeListener listener) {
super.setOnPageChangeListener( new InnerOnPageChangeListener( listener));
}
private class InnerOnPageChangeListener implements OnPageChangeListener {
private OnPageChangeListener listener;
private int position;
public InnerOnPageChangeListener(OnPageChangeListener listener) {
this.listener = listener;
}
@Override
public void onPageScrollStateChanged(int arg0) {
if(null != listener) {
listener.onPageScrollStateChanged( arg0);
}
if(arg0 == ViewPager.SCROLL_STATE_IDLE) {
if(position == mAdapter.getCount() - 1) {
setCurrentItem( 1, false);
}
else if(position == 0) {
setCurrentItem(mAdapter.getCount() - 2, false);
}
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
if(null != listener) {
listener.onPageScrolled( arg0, arg1, arg2);
}
}
@Override
public void onPageSelected(int arg0) {
position = arg0;
if(null != listener) {
listener.onPageSelected( arg0);
}
}
}
private class InnerPagerAdapter extends PagerAdapter {
private PagerAdapter adapter;
public InnerPagerAdapter(PagerAdapter adapter) {
this.adapter = adapter;
adapter.registerDataSetObserver( new DataSetObserver() {
@Override
public void onChanged() {
notifyDataSetChanged();
}
@Override
public void onInvalidated() {
notifyDataSetChanged();
}
});
}
@Override
public int getCount() {
return adapter.getCount() + 2;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return adapter.isViewFromObject( arg0, arg1);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
if(position == 0) {
position = adapter.getCount() - 1;
}
else if(position == adapter.getCount() + 1) {
position = 0;
}
else {
position -= 1;
}
return adapter.instantiateItem( container, position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
adapter.destroyItem( container, position, object);
}
}
}
2、表格(ObservableScrollView)
public class ObservableScrollView extends HorizontalScrollView{
private ScrollViewListener scrollViewListener = null;
public ObservableScrollView(Context context) {
super(context);
}
public ObservableScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public ObservableScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setOnScrollViewListener(ScrollViewListener scrollViewListener) {
this.scrollViewListener = scrollViewListener;
}
@Override
protected void onScrollChanged(int x, int y, int oldx, int oldy) {
super.onScrollChanged(x, y, oldx, oldy);
if (scrollViewListener != null) {
scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
}
}
//监听接口
public interface ScrollViewListener {
void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy);
}
}
表格布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/blue_background"
android:orientation="horizontal">
<TextView
android:layout_width="110dp"
android:layout_height="30dp"
android:gravity="center"
android:textColor="@color/white"
android:text="固定列"/>
<com.xh.library.view.ObservableScrollView
android:id="@+id/osv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fillViewport="true"
android:scrollbars="none">
<LinearLayout
android:id="@+id/ll_tits"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
</LinearLayout>
</com.xh.library.view.ObservableScrollView>
</LinearLayout>
<com.xh.emcar.pulltoRefresh.PullToRefreshLayout
android:id="@+id/pull_to_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<com.xh.emcar.view.MyListView
android:layout_width="110dp"
android:dividerHeight="0.5dp"
android:divider="@color/gray_divider"
android:layout_height="match_parent">
</com.xh.emcar.view.MyListView>
<com.xh.library.view.ObservableScrollView
android:id="@+id/osv_data"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:fillViewport="true">
<com.xh.emcar.view.MyListView
android:layout_width="match_parent"
android:dividerHeight="0.5dp"
android:divider="@color/gray_divider"
android:layout_height="match_parent">
</com.xh.emcar.view.MyListView>
</com.xh.library.view.ObservableScrollView>
</LinearLayout>
</ScrollView>
</com.xh.emcar.pulltoRefresh.PullToRefreshLayout>
</LinearLayout>
adapter中主要代码:
//动态添加布局
listItemView.ll_father.removeAllViews();
mLayountInflater=LayoutInflater.from(context);
for (int i = 0; i < listItems.size(); i++) {
linearlayout= (LinearLayout)
mLayountInflater.inflate(R.layout.layout_child,null);
TextView textView= (TextView) linearlayout.findViewById(R.id.tv_1);
textView.setText(listItems.get(i).getItemName()+"");
listItemView.ll_father.addView(linearlayout);
}
3、时间工具类:
public class DateTool {
private final static SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
private final static SimpleDateFormat sdfYearMonth = new SimpleDateFormat("yyyy-MM");
private final static SimpleDateFormat sdfYearMonthDay = new SimpleDateFormat("yyyy-MM-dd");
private final static SimpleDateFormat sdfMonthDay = new SimpleDateFormat("MM-dd");
private final static SimpleDateFormat sdfMonth = new SimpleDateFormat("MM");
private final static SimpleDateFormat sdfDay = new SimpleDateFormat("dd");
private final static SimpleDateFormat sdfTime = new SimpleDateFormat("yyyy-MM-dd HH:mm");
private final static SimpleDateFormat sdfTime2 = new SimpleDateFormat("yyyy年MM月dd HH:mm");
private final static SimpleDateFormat sdfTime3 = new SimpleDateFormat("HH:00");
// 取得季度
public static String getQurtar(){
String s = null;
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE,0);
String y = new SimpleDateFormat("yyyy").format(cal.getTime());
s = new SimpleDateFormat("MM").format(cal.getTime());
int m=Integer.parseInt(s);
int q=1;
if (m<4){
q=1;
}else if (m<7){
q=2;
}else if (m<10){
q=3;
}else if (m<13){
q=4;
}
return y+"年Q"+q;
}
/**获取两个时间间隔*/
public static String getTwoDay(String sj1, String sj2) {
SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long day = 0;
int s,m;
try {
java.util.Date date = myFormatter.parse(sj1);
java.util.Date mydate = myFormatter.parse(sj2);
day = (date.getTime() - mydate.getTime()) / (1000);
if(day>60){
s= (int) (day%60);
int big= (int) (day/60);
if(big>60){
m=big%60;
int bbig=big/60;
return bbig+"h"+m+"m"+s+"s";
}else{
return big+"m"+s+"s";
}
}else{
return day+"s";
}
} catch (Exception e) {
return "";
}
}
// 取得昨天
public static String getYesterDay(){
String s = null;
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE,-1);
s = new SimpleDateFormat( "yyyy-MM-dd HH:mm").format(cal.getTime());
return s;
}
public static String getBeforDay(int before){
String s = null;
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE,-before);
s = new SimpleDateFormat( "yyyy-MM-dd HH:mm").format(cal.getTime());
return s;
}
public static String getBeforHour(int before){
String s = null;
Calendar cal = Calendar.getInstance();
cal.add(Calendar.HOUR,-before);
s = new SimpleDateFormat( "yyyy-MM-dd HH:mm").format(cal.getTime());
return s;
}
// 取得本月天数
public static int getDaysByYearMonth(int year, int month) {
Calendar a = Calendar.getInstance();
a.set(Calendar.YEAR, year);
a.set(Calendar.MONTH, month - 1);
a.set(Calendar.DATE, 1);
a.roll(Calendar.DATE, -1);
int maxDate = a.get(Calendar.DATE);
return maxDate;
}
public static String getAfterHourDate(String sDate, int hours) {
Calendar canlendar = Calendar.getInstance(); // java.util包
SimpleDateFormat format = new SimpleDateFormat(
"yyyy-MM-dd HH:mm");
Date beginDate = null;
try {
beginDate = format.parse(sDate);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
canlendar.setTime(beginDate);
canlendar.add(Calendar.HOUR, hours); // 日期减 如果不够减会将月变动
Date date = canlendar.getTime();
SimpleDateFormat sdfd = new SimpleDateFormat("yyyy-MM-dd HH:00");
String dateStr = sdfd.format(date);
return dateStr;
}
public static int GetMonthDay(String dateString)
{
GregorianCalendar gCalendar = new GregorianCalendar();
gCalendar .setTime(fomatDate(dateString) );
int dayOfMonth= gCalendar.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);
return dayOfMonth;
}
public static String getYear2Days() {
Calendar canlendar = Calendar.getInstance();
canlendar.add(Calendar.DATE, -2);
Date date = canlendar.getTime();
return sdfYear.format(date);
}
public static String getYear() {
return sdfYear.format(new Date());
}
public static String getYearMonth() {
return sdfYearMonth.format(new Date());
}
public static String getYearLastMonth() {
Calendar canlendar = Calendar.getInstance();
canlendar.add(Calendar.MONTH, -1);
Date date = canlendar.getTime();
return sdfYearMonth.format(date);
}
public static String getYearMonthDay() {
return sdfYearMonthDay.format(new Date());
}
public static String getMonthDay() {
return sdfMonthDay.format(new Date());
}
public static String getMonth() {
return sdfMonth.format(new Date());
}
public static String getDay() {
return sdfMonthDay.format(new Date());
}
public static String getTime() {
return sdfTime3.format(new Date());
}
public static boolean compareDate(String s, String e) {
if (fomatDate(s) == null || fomatDate(e) == null) {
return false;
}
return fomatDate(s).getTime() >= fomatDate(e).getTime();
}
/**
* 格式化日期
*
* @return
*/
public static Date fomatDate(String date) {
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
try {
return fmt.parse(date);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
public static String fomatDate2(String date) {
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
try {
return sdfDay.format(fmt.parse(date));
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
public static String fomatDatelyl(String date) {
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm");
return fmt.format(date);
}
public static String fomatDateAll(String date,String fmt2) {
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
SimpleDateFormat sdfTime2 = new SimpleDateFormat(fmt2);
return sdfTime2.format(fmt.parse(date));
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
public static Date fomatTime(String date) {
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return fmt.parse(date);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
/**
* 校验日期是否合法
*
* @return
*/
public static boolean isValidDate(String s) {
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
try {
fmt.parse(s);
return true;
} catch (Exception e) {
// 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
return false;
}
}
public static int getDiffYear(String startTime, String endTime) {
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
try {
long aa = 0;
int years = (int) (((fmt.parse(endTime).getTime() - fmt.parse(
startTime).getTime()) / (1000 * 60 * 60 * 24)) / 365);
return years;
} catch (Exception e) {
// 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
return 0;
}
}
/**
* <li>功能描述:时间相减得到天数
*
* @param beginDateStr
* @param endDateStr
* @return long
* @author Administrator
*/
public static long getDaySub(String beginDateStr, String endDateStr) {
long day = 0;
SimpleDateFormat format = new SimpleDateFormat(
"yyyy-MM-dd");
Date beginDate = null;
Date endDate = null;
try {
beginDate = format.parse(beginDateStr);
endDate = format.parse(endDateStr);
} catch (ParseException e) {
e.printStackTrace();
}
day = (endDate.getTime() - beginDate.getTime()) / (24 * 60 * 60 * 1000);
// System.out.println("相隔的天数="+day);
return day;
}
/**
* 得到n天之后的日期
*
* @param days
* @return
*/
public static String getAfterDayDate(String days) {
int daysInt = Integer.parseInt(days);
Calendar canlendar = Calendar.getInstance(); // java.util包
canlendar.add(Calendar.DATE, daysInt); // 日期减 如果不够减会将月变动
Date date = canlendar.getTime();
SimpleDateFormat sdfd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = sdfd.format(date);
return dateStr;
}
/*public static String GetMonth() {
Calendar canlendar = Calendar.getInstance(); // java.util包
Date date = canlendar.getTime();
SimpleDateFormat sdfd = new SimpleDateFormat("yyyy-MM-01");
String dateStr = sdfd.format(date);
return dateStr;
}*/
public static String GetNextMonth() {
Calendar canlendar = Calendar.getInstance(); // java.util包
canlendar.add(Calendar.MONTH,1);
Date date = canlendar.getTime();
SimpleDateFormat sdfd = new SimpleDateFormat("yyyy-MM-01");
String dateStr = sdfd.format(date);
return dateStr;
}
public static String GetNextMonth(String sdate) {
Calendar canlendar = Calendar.getInstance(); // java.util包
SimpleDateFormat format = new SimpleDateFormat(
"yyyy-MM-dd");
Date beginDate = null;
try {
beginDate = format.parse(sdate);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Calendar canlendar = Calendar.getInstance(); // java.util包
canlendar.setTime(beginDate);
canlendar.add(Calendar.MONTH,1);
Date date = canlendar.getTime();
SimpleDateFormat sdfd = new SimpleDateFormat("yyyy-MM-01");
String dateStr = sdfd.format(date);
return dateStr;
}
public static String getAfterDayDate2(String sDate, int days) {
Calendar canlendar = Calendar.getInstance(); // java.util包
SimpleDateFormat format = new SimpleDateFormat(
"yyyy-MM-dd");
Date beginDate = null;
try {
beginDate = format.parse(sDate);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
canlendar.setTime(beginDate);
canlendar.add(Calendar.DATE, days); // 日期减 如果不够减会将月变动
Date date = canlendar.getTime();
SimpleDateFormat sdfd = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = sdfd.format(date);
return dateStr;
}
public static String getAfterDayDate(String sDate, int days) {
Calendar canlendar = Calendar.getInstance(); // java.util包
SimpleDateFormat format = new SimpleDateFormat(
"yyyy-MM-dd");
Date beginDate = null;
try {
beginDate = format.parse(sDate);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
canlendar.setTime(beginDate);
canlendar.add(Calendar.DATE, days); // 日期减 如果不够减会将月变动
Date date = canlendar.getTime();
SimpleDateFormat sdfd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = sdfd.format(date);
return dateStr;
}
public static String getWeekForDate(String sDate) {
Calendar canlendar = Calendar.getInstance(); // java.util包
SimpleDateFormat format = new SimpleDateFormat(
"yyyy-MM-dd");
Date beginDate = null;
try {
beginDate = format.parse(sDate);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
canlendar.setTime(beginDate);
Date date = canlendar.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("E",Locale.CHINA);
String dateStr = sdf.format(date);
return dateStr;
}
/**
* 得到n天之后是周几
*
* @param days
* @return
*/
public static String getAfterDayWeek(String days) {
int daysInt = Integer.parseInt(days);
Calendar canlendar = Calendar.getInstance(); // java.util包
canlendar.add(Calendar.DATE, daysInt); // 日期减 如果不够减会将月变动
Date date = canlendar.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("E");
String dateStr = sdf.format(date);
return dateStr;
}
public static String getFormatDate(String format) {
SimpleDateFormat formatter = new SimpleDateFormat(format);
return formatter.format(new Date());
}
public static String getDate() {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
return formatter.format(new Date());
}
public static String getDateTime() {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return formatter.format(new Date());
}
public static String GetWeekArea(int year, int week) {
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.WEEK_OF_YEAR, week);
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);// 设置周一
c.setFirstDayOfWeek(Calendar.MONDAY);
SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy-MM-dd");
String ssdate = sdfYear.format(c.getTime());
return ssdate;
}
}
获取第几周:
public Integer whatWeek(String datetime) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse(datetime);
Calendar calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(Calendar.MONDAY);
calendar.setTime(date);
Integer weekNumbe = calendar.get(Calendar.WEEK_OF_YEAR);
return weekNumbe;
}
4、自定义弹框
private void showselectcontrolpop() {
View view = getLayoutInflater().inflate(R.layout.pop_select_control, null);
ImageView img_close = (ImageView) view.findViewById(R.id.img_close);
// 也可按屏幕宽高比例进行设置宽高
WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
final AlertDialog dialog = new AlertDialog.Builder(this)
.setView(view)
.setCancelable(false)
.create();
dialog.show();
// 调整dialog背景大小
Window dialogWindow = dialog.getWindow();
// 设置大概位置
dialogWindow.setGravity(Gravity.CENTER);
// 设置具体参数
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
lp.width = (int) (display.getWidth() * 0.85);
//lp.height = (int) (display.getWidth() * 0.85);
dialogWindow.setAttributes(lp);
img_close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
}
布局大小:
DisplayMetrics dm = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(dm);
WindowManager.LayoutParams lp = window.getAttributes();
lp.width = dm.widthPixels;
5、下拉列表:
private PopupWindow popupWindowtype;
private ListView lv_group_type;
private String paramCode="";
private void showpoptype1(View parent) {
if (popupWindowtype1 == null) {
LayoutInflater layoutInflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view_type = layoutInflater.inflate(R.layout.group_list, null);
List<String> listNme = Arrays.asList(new String[]{"请选择", "1"});
lv_group_type = (ListView) view_type.findViewById(R.id.lvGroup);
StringTypeAdapter groupAdapter = new StringTypeAdapter(this, listNme, 15);
lv_group_type.setAdapter(groupAdapter);
// 创建一个PopuWidow对象
popupWindowtype = new PopupWindow(view_type, 220, LinearLayout.LayoutParams.WRAP_CONTENT);
}
// 使其聚集
popupWindowtype.setFocusable(true);
// 设置允许在外点击消失
popupWindowtype.setOutsideTouchable(true);
// 这个是为了点击“返回Back”也能使其消失,并且并不会影响你的背景
popupWindowtype.setBackgroundDrawable(new BitmapDrawable());
popupWindowtype.showAsDropDown(parent);
lv_group_type.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view,
int position, long id) {
if (position == 0) {
tv_select1.setText("请选择");
paramCode="";
} else {
tv_select1.setText("1");
paramCode = "1";
}
if (popupWindowtype != null) {
popupWindowtype.dismiss();
}
}
});
}
6、时间选择器:
customDatePicker = new CustomDatePicker(getActivity(), new CustomDatePicker.ResultHandler() {
@Override
public void handle(String time2) { // 回调接口,获得选中的时间
if (isstart) {
time = time2.substring(0, 10);
timeStart.setText(time);
} else {
endtime = time2.substring(0, 10);
timeEnd.setText(endtime);
}
}
}, "2000-01-01 00:00", DateTool.getDateTime()); // 初始化日期格式请用:yyyy-MM-dd HH:mm,否则不能正常运行
customDatePicker.showSpecificTime(false); // 显示时和分
customDatePicker.setIsLoop(true); // 允许循环滚动
其中CustomDatePicker代码:
public class CustomDatePicker {
/**
* 定义结果回调接口
*/
public interface ResultHandler {
void handle(String time);
}
public enum SCROLL_TYPE {
HOUR(1),
MINUTE(2);
SCROLL_TYPE(int value) {
this.value = value;
}
public int value;
}
private int scrollUnits = SCROLL_TYPE.HOUR.value + SCROLL_TYPE.MINUTE.value;
private ResultHandler handler;
private Context context;
private boolean canAccess = false;
private Dialog datePickerDialog;
private DatePickerView year_pv, month_pv, day_pv, hour_pv, minute_pv;
private static final int MAX_MINUTE = 59;
private static final int MAX_HOUR = 23;
private static final int MIN_MINUTE = 0;
private static final int MIN_HOUR = 0;
private static final int MAX_MONTH = 12;
private ArrayList<String> year, month, day, hour, minute;
private int startYear, startMonth, startDay, startHour, startMinute, endYear, endMonth, endDay, endHour, endMinute;
private boolean spanYear, spanMon, spanDay, spanHour, spanMin;
private Calendar selectedCalender, startCalendar, endCalendar;
private TextView tv_title,tv_cancle, tv_select, hour_text, minute_text,day_text,month_text,year_text;
boolean isstart=true;
boolean isshow,ismonth=true;
public CustomDatePicker(Context context, ResultHandler resultHandler, String startDate, String endDate) {
if (isValidDate(startDate, "yyyy-MM-dd HH:mm") && isValidDate(endDate, "yyyy-MM-dd HH:mm")) {
canAccess = true;
this.context = context;
this.handler = resultHandler;
selectedCalender = Calendar.getInstance();
startCalendar = Calendar.getInstance();
endCalendar = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.CHINA);
try {
startCalendar.setTime(sdf.parse(startDate));
endCalendar.setTime(sdf.parse(endDate));
} catch (ParseException e) {
e.printStackTrace();
}
initDialog();
initView();
}
}
private void initDialog() {
if (datePickerDialog == null) {
datePickerDialog = new Dialog(context, R.style.time_dialog);
datePickerDialog.setCancelable(false);
datePickerDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
datePickerDialog.setContentView(R.layout.custom_date_picker);
Window window = datePickerDialog.getWindow();
window.setGravity(Gravity.BOTTOM);
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(dm);
WindowManager.LayoutParams lp = window.getAttributes();
lp.width = dm.widthPixels;
window.setAttributes(lp);
}
}
private void initView() {
year_pv = (DatePickerView) datePickerDialog.findViewById(R.id.year_pv);
month_pv = (DatePickerView) datePickerDialog.findViewById(R.id.month_pv);
day_pv = (DatePickerView) datePickerDialog.findViewById(R.id.day_pv);
hour_pv = (DatePickerView) datePickerDialog.findViewById(R.id.hour_pv);
minute_pv = (DatePickerView) datePickerDialog.findViewById(R.id.minute_pv);
tv_cancle = (TextView) datePickerDialog.findViewById(R.id.tv_cancle);
tv_select = (TextView) datePickerDialog.findViewById(R.id.tv_select);
hour_text = (TextView) datePickerDialog.findViewById(R.id.hour_text);
minute_text = (TextView) datePickerDialog.findViewById(R.id.minute_text);
tv_title=datePickerDialog.findViewById(R.id.tv_title);
day_text = (TextView) datePickerDialog.findViewById(R.id.day_text);
month_text = (TextView) datePickerDialog.findViewById(R.id.month_text);
year_text=datePickerDialog.findViewById(R.id.year_text);
tv_cancle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
datePickerDialog.dismiss();
}
});
tv_select.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.CHINA);
handler.handle(sdf.format(selectedCalender.getTime()));
datePickerDialog.dismiss();
}
});
}
private void initParameter() {
startYear = startCalendar.get(Calendar.YEAR);
startMonth = startCalendar.get(Calendar.MONTH) + 1;
startDay = startCalendar.get(Calendar.DAY_OF_MONTH);
startHour = startCalendar.get(Calendar.HOUR_OF_DAY);
startMinute = startCalendar.get(Calendar.MINUTE);
endYear = endCalendar.get(Calendar.YEAR);
endMonth = endCalendar.get(Calendar.MONTH) + 1;
endDay = endCalendar.get(Calendar.DAY_OF_MONTH);
endHour = endCalendar.get(Calendar.HOUR_OF_DAY);
endMinute = endCalendar.get(Calendar.MINUTE);
spanYear = startYear != endYear;
spanMon = (!spanYear) && (startMonth != endMonth);
spanDay = (!spanMon) && (startDay != endDay);
spanHour = (!spanDay) && (startHour != endHour);
spanMin = (!spanHour) && (startMinute != endMinute);
selectedCalender.setTime(startCalendar.getTime());
}
private void initTimer() {
initArrayList();
if (spanYear) {
for (int i = startYear; i <= endYear; i++) {
year.add(String.valueOf(i));
}
for (int i = startMonth; i <= MAX_MONTH; i++) {
month.add(formatTimeUnit(i));
}
for (int i = startDay; i <= startCalendar.getActualMaximum(Calendar.DAY_OF_MONTH); i++) {
day.add(formatTimeUnit(i));
}
if ((scrollUnits & SCROLL_TYPE.HOUR.value) != SCROLL_TYPE.HOUR.value) {
hour.add(formatTimeUnit(startHour));
} else {
for (int i = 0; i <= MAX_HOUR; i++) {
hour.add(formatTimeUnit(i));
}
}
if ((scrollUnits & SCROLL_TYPE.MINUTE.value) != SCROLL_TYPE.MINUTE.value) {
minute.add(formatTimeUnit(startMinute));
} else {
for (int i = 0; i <= MAX_MINUTE; i++) {
minute.add(formatTimeUnit(i));
}
}
} else if (spanMon) {
year.add(String.valueOf(startYear));
for (int i = startMonth; i <= endMonth; i++) {
month.add(formatTimeUnit(i));
}
for (int i = startDay; i <= startCalendar.getActualMaximum(Calendar.DAY_OF_MONTH); i++) {
day.add(formatTimeUnit(i));
}
if ((scrollUnits & SCROLL_TYPE.HOUR.value) != SCROLL_TYPE.HOUR.value) {
hour.add(formatTimeUnit(startHour));
} else {
for (int i = 0; i <= MAX_HOUR; i++) {
hour.add(formatTimeUnit(i));
}
}
if ((scrollUnits & SCROLL_TYPE.MINUTE.value) != SCROLL_TYPE.MINUTE.value) {
minute.add(formatTimeUnit(startMinute));
} else {
for (int i = 0; i <= MAX_MINUTE; i++) {
minute.add(formatTimeUnit(i));
}
}
} else if (spanDay) {
year.add(String.valueOf(startYear));
month.add(formatTimeUnit(startMonth));
for (int i = startDay; i <= endDay; i++) {
day.add(formatTimeUnit(i));
}
if ((scrollUnits & SCROLL_TYPE.HOUR.value) != SCROLL_TYPE.HOUR.value) {
hour.add(formatTimeUnit(startHour));
} else {
for (int i = 0; i <= MAX_HOUR; i++) {
hour.add(formatTimeUnit(i));
}
}
if ((scrollUnits & SCROLL_TYPE.MINUTE.value) != SCROLL_TYPE.MINUTE.value) {
minute.add(formatTimeUnit(startMinute));
} else {
for (int i = 0; i <= MAX_MINUTE; i++) {
minute.add(formatTimeUnit(i));
}
}
} else if (spanHour) {
year.add(String.valueOf(startYear));
month.add(formatTimeUnit(startMonth));
day.add(formatTimeUnit(startDay));
if ((scrollUnits & SCROLL_TYPE.HOUR.value) != SCROLL_TYPE.HOUR.value) {
hour.add(formatTimeUnit(startHour));
} else {
for (int i = startHour; i <= endHour; i++) {
hour.add(formatTimeUnit(i));
}
}
if ((scrollUnits & SCROLL_TYPE.MINUTE.value) != SCROLL_TYPE.MINUTE.value) {
minute.add(formatTimeUnit(startMinute));
} else {
for (int i = 0; i <= MAX_MINUTE; i++) {
minute.add(formatTimeUnit(i));
}
}
} else if (spanMin) {
year.add(String.valueOf(startYear));
month.add(formatTimeUnit(startMonth));
day.add(formatTimeUnit(startDay));
hour.add(formatTimeUnit(startHour));
if ((scrollUnits & SCROLL_TYPE.MINUTE.value) != SCROLL_TYPE.MINUTE.value) {
minute.add(formatTimeUnit(startMinute));
} else {
for (int i = startMinute; i <= endMinute; i++) {
minute.add(formatTimeUnit(i));
}
}
}
loadComponent();
}
/**
* 将“0-9”转换为“00-09”
*/
private String formatTimeUnit(int unit) {
return unit < 10 ? "0" + String.valueOf(unit) : String.valueOf(unit);
}
private void initArrayList() {
if (year == null) year = new ArrayList<>();
if (month == null) month = new ArrayList<>();
if (day == null) day = new ArrayList<>();
if (hour == null) hour = new ArrayList<>();
if (minute == null) minute = new ArrayList<>();
year.clear();
month.clear();
day.clear();
hour.clear();
minute.clear();
}
private ArrayList<String> mdw=new ArrayList<>();
private void loadComponent() {
year_pv.setData(year);
month_pv.setData(month);
day_pv.setData(day);
hour_pv.setData(hour);
minute_pv.setData(minute);
year_pv.setSelected(0);
month_pv.setSelected(0);
day_pv.setSelected(0);
hour_pv.setSelected(0);
minute_pv.setSelected(0);
executeScroll();
}
private void addListener() {
year_pv.setOnSelectListener(new DatePickerView.onSelectListener() {
@Override
public void onSelect(String text,int index) {
selectedCalender.set(Calendar.YEAR, Integer.parseInt(text));
monthChange();
}
});
month_pv.setOnSelectListener(new DatePickerView.onSelectListener() {
@Override
public void onSelect(String text,int index) {
selectedCalender.set(Calendar.DAY_OF_MONTH, 1);
selectedCalender.set(Calendar.MONTH, Integer.parseInt(text) - 1);
dayChange();
}
});
day_pv.setOnSelectListener(new DatePickerView.onSelectListener() {
@Override
public void onSelect(String text,int index) {
selectedCalender.set(Calendar.DAY_OF_MONTH, Integer.parseInt(text));
hourChange();
}
});
hour_pv.setOnSelectListener(new DatePickerView.onSelectListener() {
@Override
public void onSelect(String text,int index) {
selectedCalender.set(Calendar.HOUR_OF_DAY, Integer.parseInt(text));
minuteChange();
}
});
minute_pv.setOnSelectListener(new DatePickerView.onSelectListener() {
@Override
public void onSelect(String text,int index) {
selectedCalender.set(Calendar.MINUTE, Integer.parseInt(text));
}
});
}
private void monthChange() {
month.clear();
int selectedYear = selectedCalender.get(Calendar.YEAR);
if (selectedYear == startYear) {
for (int i = startMonth; i <= MAX_MONTH; i++) {
month.add(formatTimeUnit(i));
}
} else if (selectedYear == endYear) {
for (int i = 1; i <= endMonth; i++) {
month.add(formatTimeUnit(i));
}
} else {
for (int i = 1; i <= MAX_MONTH; i++) {
month.add(formatTimeUnit(i));
}
}
selectedCalender.set(Calendar.MONTH, Integer.parseInt(month.get(0)) - 1);
month_pv.setData(month);
month_pv.setSelected(0);
executeAnimator(month_pv);
month_pv.postDelayed(new Runnable() {
@Override
public void run() {
dayChange();
}
}, 100);
}
private void dayChange() {
day.clear();
int selectedYear = selectedCalender.get(Calendar.YEAR);
int selectedMonth = selectedCalender.get(Calendar.MONTH) + 1;
if (selectedYear == startYear && selectedMonth == startMonth) {
for (int i = startDay; i <= selectedCalender.getActualMaximum(Calendar.DAY_OF_MONTH); i++) {
day.add(formatTimeUnit(i));
}
} else if (selectedYear == endYear && selectedMonth == endMonth) {
for (int i = 1; i <= endDay; i++) {
day.add(formatTimeUnit(i));
}
} else {
for (int i = 1; i <= selectedCalender.getActualMaximum(Calendar.DAY_OF_MONTH); i++) {
day.add(formatTimeUnit(i));
}
}
selectedCalender.set(Calendar.DAY_OF_MONTH, Integer.parseInt(day.get(0)));
day_pv.setData(day);
day_pv.setSelected(0);
executeAnimator(day_pv);
day_pv.postDelayed(new Runnable() {
@Override
public void run() {
hourChange();
}
}, 100);
}
private void hourChange() {
if ((scrollUnits & SCROLL_TYPE.HOUR.value) == SCROLL_TYPE.HOUR.value) {
hour.clear();
int selectedYear = selectedCalender.get(Calendar.YEAR);
int selectedMonth = selectedCalender.get(Calendar.MONTH) + 1;
int selectedDay = selectedCalender.get(Calendar.DAY_OF_MONTH);
if (selectedYear == startYear && selectedMonth == startMonth && selectedDay == startDay) {
for (int i = startHour; i <= MAX_HOUR; i++) {
hour.add(formatTimeUnit(i));
}
} else if (selectedYear == endYear && selectedMonth == endMonth && selectedDay == endDay) {
for (int i = MIN_HOUR; i <= endHour; i++) {
hour.add(formatTimeUnit(i));
}
} else {
for (int i = MIN_HOUR; i <= MAX_HOUR; i++) {
hour.add(formatTimeUnit(i));
}
}
selectedCalender.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hour.get(0)));
hour_pv.setData(hour);
hour_pv.setSelected(0);
executeAnimator(hour_pv);
}
hour_pv.postDelayed(new Runnable() {
@Override
public void run() {
minuteChange();
}
}, 100);
}
private void minuteChange() {
if ((scrollUnits & SCROLL_TYPE.MINUTE.value) == SCROLL_TYPE.MINUTE.value) {
minute.clear();
int selectedYear = selectedCalender.get(Calendar.YEAR);
int selectedMonth = selectedCalender.get(Calendar.MONTH) + 1;
int selectedDay = selectedCalender.get(Calendar.DAY_OF_MONTH);
int selectedHour = selectedCalender.get(Calendar.HOUR_OF_DAY);
if (selectedYear == startYear && selectedMonth == startMonth && selectedDay == startDay && selectedHour == startHour) {
for (int i = startMinute; i <= MAX_MINUTE; i++) {
minute.add(formatTimeUnit(i));
}
} else if (selectedYear == endYear && selectedMonth == endMonth && selectedDay == endDay && selectedHour == endHour) {
for (int i = MIN_MINUTE; i <= endMinute; i++) {
minute.add(formatTimeUnit(i));
}
} else {
for (int i = MIN_MINUTE; i <= MAX_MINUTE; i++) {
minute.add(formatTimeUnit(i));
}
}
selectedCalender.set(Calendar.MINUTE, Integer.parseInt(minute.get(0)));
minute_pv.setData(minute);
minute_pv.setSelected(0);
executeAnimator(minute_pv);
}
executeScroll();
}
private void executeAnimator(View view) {
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f, 0f, 1f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 1f, 1.3f, 1f);
PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("scaleY", 1f, 1.3f, 1f);
ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY, pvhZ).setDuration(200).start();
}
private void executeScroll() {
year_pv.setCanScroll(year.size() > 1);
month_pv.setCanScroll(month.size() > 1);
day_pv.setCanScroll(day.size() > 1);
hour_pv.setCanScroll(hour.size() > 1 && (scrollUnits & SCROLL_TYPE.HOUR.value) == SCROLL_TYPE.HOUR.value);
minute_pv.setCanScroll(minute.size() > 1 && (scrollUnits & SCROLL_TYPE.MINUTE.value) == SCROLL_TYPE.MINUTE.value);
}
private int disScrollUnit(SCROLL_TYPE... scroll_types) {
if (scroll_types == null || scroll_types.length == 0) {
scrollUnits = SCROLL_TYPE.HOUR.value + SCROLL_TYPE.MINUTE.value;
} else {
for (SCROLL_TYPE scroll_type : scroll_types) {
scrollUnits ^= scroll_type.value;
}
}
return scrollUnits;
}
public void settitle(String title){
tv_title.setText(title);
}
public void show(String time) {
if (canAccess) {
if (isValidDate(time, "yyyy-MM-dd")) {
if (startCalendar.getTime().getTime() < endCalendar.getTime().getTime()) {
canAccess = true;
initParameter();
initTimer();
addListener();
setSelectedTime(time);
datePickerDialog.show();
}
} else {
canAccess = false;
}
}
}
/**
* 设置日期控件是否显示时和分
*/
public void showSpecificTime(boolean show) {
if (canAccess) {
if (show) {
disScrollUnit();
hour_pv.setVisibility(View.VISIBLE);
hour_text.setVisibility(View.VISIBLE);
minute_pv.setVisibility(View.VISIBLE);
minute_text.setVisibility(View.VISIBLE);
} else {
disScrollUnit(SCROLL_TYPE.HOUR, SCROLL_TYPE.MINUTE);
hour_pv.setVisibility(View.GONE);
hour_text.setVisibility(View.GONE);
minute_pv.setVisibility(View.GONE);
minute_text.setVisibility(View.GONE);
}
}
}
/**
* 设置日期控件是否显示时和分
*/
public void showSpecificTime(int type) {//-1排课时间显示 特殊处理
// 0 不显示年 1 只显示年 2显示年月 3年月日 4年月日时 5都显示 6只显示时分
//7 只显示时
if (canAccess) {
switch (type) {
case -1:
disScrollUnit();
year_pv.setVisibility(View.GONE);
year_text.setVisibility(View.GONE);
month_pv.setVisibility(View.GONE);
month_text.setVisibility(View.GONE);
day_pv.setVisibility(View.GONE);
day_text.setVisibility(View.GONE);
hour_pv.setVisibility(View.VISIBLE);
hour_text.setVisibility(View.VISIBLE);
minute_pv.setVisibility(View.VISIBLE);
minute_text.setVisibility(View.VISIBLE);
break;
case 6:
disScrollUnit();
year_pv.setVisibility(View.GONE);
year_text.setVisibility(View.GONE);
month_pv.setVisibility(View.GONE);
month_text.setVisibility(View.GONE);
day_pv.setVisibility(View.GONE);
day_text.setVisibility(View.GONE);
hour_pv.setVisibility(View.VISIBLE);
hour_text.setVisibility(View.VISIBLE);
minute_pv.setVisibility(View.VISIBLE);
minute_text.setVisibility(View.VISIBLE);
break;
case 7:
disScrollUnit();
year_pv.setVisibility(View.GONE);
year_text.setVisibility(View.GONE);
month_pv.setVisibility(View.GONE);
month_text.setVisibility(View.GONE);
day_pv.setVisibility(View.GONE);
day_text.setVisibility(View.GONE);
hour_pv.setVisibility(View.VISIBLE);
hour_text.setVisibility(View.VISIBLE);
minute_pv.setVisibility(View.GONE);
minute_text.setVisibility(View.GONE);
break;
case 0:
disScrollUnit();
year_pv.setVisibility(View.GONE);
year_text.setVisibility(View.GONE);
month_pv.setVisibility(View.VISIBLE);
month_text.setVisibility(View.VISIBLE);
day_pv.setVisibility(View.VISIBLE);
day_text.setVisibility(View.VISIBLE);
hour_pv.setVisibility(View.VISIBLE);
hour_text.setVisibility(View.VISIBLE);
minute_pv.setVisibility(View.VISIBLE);
minute_text.setVisibility(View.VISIBLE);
break;
case 1:
disScrollUnit();
month_pv.setVisibility(View.GONE);
month_text.setVisibility(View.GONE);
day_pv.setVisibility(View.GONE);
day_text.setVisibility(View.GONE);
hour_pv.setVisibility(View.GONE);
hour_text.setVisibility(View.GONE);
minute_pv.setVisibility(View.GONE);
minute_text.setVisibility(View.GONE);
break;
case 2:
disScrollUnit();
month_pv.setVisibility(View.VISIBLE);
month_text.setVisibility(View.VISIBLE);
day_pv.setVisibility(View.GONE);
day_text.setVisibility(View.GONE);
hour_pv.setVisibility(View.GONE);
hour_text.setVisibility(View.GONE);
minute_pv.setVisibility(View.GONE);
minute_text.setVisibility(View.GONE);
break;
case 3:
disScrollUnit();
month_pv.setVisibility(View.VISIBLE);
month_text.setVisibility(View.VISIBLE);
day_pv.setVisibility(View.VISIBLE);
day_text.setVisibility(View.VISIBLE);
hour_pv.setVisibility(View.GONE);
hour_text.setVisibility(View.GONE);
minute_pv.setVisibility(View.GONE);
minute_text.setVisibility(View.GONE);
break;
case 4:
disScrollUnit();
month_pv.setVisibility(View.VISIBLE);
month_text.setVisibility(View.VISIBLE);
day_pv.setVisibility(View.VISIBLE);
day_text.setVisibility(View.VISIBLE);
hour_pv.setVisibility(View.VISIBLE);
hour_text.setVisibility(View.VISIBLE);
minute_pv.setVisibility(View.GONE);
minute_text.setVisibility(View.GONE);
break;
case 5:
disScrollUnit();
month_pv.setVisibility(View.VISIBLE);
month_text.setVisibility(View.VISIBLE);
day_pv.setVisibility(View.VISIBLE);
day_text.setVisibility(View.VISIBLE);
hour_pv.setVisibility(View.VISIBLE);
hour_text.setVisibility(View.VISIBLE);
minute_pv.setVisibility(View.VISIBLE);
minute_text.setVisibility(View.VISIBLE);
break;
default:
break;
}
}
}
/**
* 设置日期控件是否可以循环滚动
*/
public void setIsLoop(boolean isLoop) {
if (canAccess) {
this.year_pv.setIsLoop(isLoop);
this.month_pv.setIsLoop(isLoop);
this.day_pv.setIsLoop(isLoop);
this.hour_pv.setIsLoop(isLoop);
this.minute_pv.setIsLoop(isLoop);
}
}
public void showday(boolean show){
if (canAccess) {
if (show) {
disScrollUnit();
day_pv.setVisibility(View.VISIBLE);
day_text.setVisibility(View.VISIBLE);
} else {
day_pv.setVisibility(View.GONE);
day_text.setVisibility(View.GONE);
}
}
}
/**
* 设置日期控件默认选中的时间
*/
public void setSelectedTime(String time) {
if (canAccess) {
String[] str = time.split(" ");
String[] dateStr = str[0].split("-");
year_pv.setSelected(dateStr[0]);
selectedCalender.set(Calendar.YEAR, Integer.parseInt(dateStr[0]));
month_pv.setSelected(dateStr[1]);
selectedCalender.set(Calendar.MONTH, Integer.parseInt(dateStr[1]) - 1);
executeAnimator(month_pv);
day_pv.setData(day);
day_pv.setSelected(dateStr[2]);
selectedCalender.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateStr[2]));
executeAnimator(day_pv);
if (str.length == 2) {
String[] timeStr = str[1].split(":");
if ((scrollUnits & SCROLL_TYPE.HOUR.value) == SCROLL_TYPE.HOUR.value) {
hour_pv.setData(hour);
hour_pv.setSelected(timeStr[0]);
selectedCalender.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeStr[0]));
executeAnimator(hour_pv);
}
if ((scrollUnits & SCROLL_TYPE.MINUTE.value) == SCROLL_TYPE.MINUTE.value) {
minute_pv.setData(minute);
minute_pv.setSelected(timeStr[1]);
selectedCalender.set(Calendar.MINUTE, Integer.parseInt(timeStr[1]));
executeAnimator(minute_pv);
}
}
executeScroll();
}
}
/**
* 验证字符串是否是一个合法的日期格式
*/
private boolean isValidDate(String date, String template) {
boolean convertSuccess = true;
// 指定日期格式
SimpleDateFormat format = new SimpleDateFormat(template, Locale.CHINA);
try {
// 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期,比如2015/02/29会被接受,并转换成2015/03/01
format.setLenient(false);
format.parse(date);
} catch (Exception e) {
// 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
convertSuccess = false;
}
return convertSuccess;
}
}
其中CustomDatePicker布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="#FFF"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/color_white"
android:padding="10dp">
<TextView
android:id="@+id/tv_cancle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:padding="10dp"
android:text="取消"
android:textColor="#59B29C"
android:textSize="@dimen/text_20" />
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="请选择时间"
android:textColor="#59B29C"
android:textSize="@dimen/text_24" />
<TextView
android:id="@+id/tv_select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:padding="10dp"
android:text="确定"
android:textColor="#59B29C"
android:textSize="@dimen/text_20" />
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="#11112233" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:background="@color/color_white"
android:orientation="horizontal"
android:paddingBottom="15dp"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:paddingTop="15dp">
<com.project.view.datepicker.DatePickerView
android:id="@+id/year_pv"
android:layout_width="0dp"
android:layout_height="160dp"
android:layout_weight="3" />
<TextView
android:id="@+id/year_text"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="年"
android:textColor="#333333"
android:textSize="18sp" />
<com.project.view.datepicker.DatePickerView
android:id="@+id/month_pv"
android:layout_width="0dp"
android:layout_height="160dp"
android:layout_weight="2" />
<TextView
android:id="@+id/month_text"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="月"
android:textColor="#333333"
android:textSize="18sp" />
<com.project.view.datepicker.DatePickerView
android:id="@+id/day_pv"
android:layout_width="0dp"
android:layout_height="160dp"
android:layout_weight="2" />
<TextView
android:id="@+id/day_text"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="日"
android:textColor="#333333"
android:textSize="18sp" />
<com.project.view.datepicker.DatePickerView
android:id="@+id/hour_pv"
android:layout_width="0dp"
android:layout_height="160dp"
android:layout_weight="2" />
<TextView
android:id="@+id/hour_text"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="时"
android:textColor="#333333"
android:textSize="18sp" />
<com.project.view.datepicker.DatePickerView
android:id="@+id/minute_pv"
android:layout_width="0dp"
android:layout_height="160dp"
android:layout_weight="2" />
<TextView
android:id="@+id/minute_text"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="分"
android:textColor="#333333"
android:textSize="18sp" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
其中DatePickerView类:
public class DatePickerView extends View {
private Context context;
/**
* 新增字段 控制是否首尾相接循环显示 默认为循环显示
*/
private boolean loop = true;
/**
* text之间间距和minTextSize之比
*/
public static final float MARGIN_ALPHA = 2.8f;
/**
* 自动回滚到中间的速度
*/
public static final float SPEED = 10;
private List<String> mDataList;
/**
* 选中的位置,这个位置是mDataList的中心位置,一直不变
*/
private int mCurrentSelected;
private Paint mPaint, nPaint;
private float mMaxTextSize = 80;
private float mMinTextSize = 40;
private float mMaxTextAlpha = 255;
private float mMinTextAlpha = 120;
private int mViewHeight;
private int mViewWidth;
private float mLastDownY;
/**
* 滑动的距离
*/
private float mMoveLen = 0;
private boolean isInit = false;
private boolean canScroll = true;
private onSelectListener mSelectListener;
private Timer timer;
private MyTimerTask mTask;
private Handler updateHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (Math.abs(mMoveLen) < SPEED) {
mMoveLen = 0;
if (mTask != null) {
mTask.cancel();
mTask = null;
performSelect();
}
} else {
// 这里mMoveLen / Math.abs(mMoveLen)是为了保有mMoveLen的正负号,以实现上滚或下滚
mMoveLen = mMoveLen - mMoveLen / Math.abs(mMoveLen) * SPEED;
}
invalidate();
}
};
public DatePickerView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
init();
}
public void setOnSelectListener(onSelectListener listener) {
mSelectListener = listener;
}
private void performSelect() {
if (mSelectListener != null) {
mSelectListener.onSelect(mDataList.get(mCurrentSelected),mCurrentSelected);
}
}
public void setData(List<String> datas) {
mDataList = datas;
mCurrentSelected = datas.size() / 4;
invalidate();
}
/**
* 选择选中的item的index
*/
public void setSelected(int selected) {
mCurrentSelected = selected;
if (loop) {
int distance = mDataList.size() / 2 - mCurrentSelected;
if (distance < 0) {
for (int i = 0; i < -distance; i++) {
moveHeadToTail();
mCurrentSelected--;
}
} else if (distance > 0) {
for (int i = 0; i < distance; i++) {
moveTailToHead();
mCurrentSelected++;
}
}
}
invalidate();
}
/**
* 选择选中的内容
*/
public void setSelected(String mSelectItem) {
for (int i = 0; i < mDataList.size(); i++) {
if (mDataList.get(i).equals(mSelectItem)) {
setSelected(i);
break;
}
}
}
private void moveHeadToTail() {
if (loop) {
String head = mDataList.get(0);
mDataList.remove(0);
mDataList.add(head);
}
}
private void moveTailToHead() {
if (loop) {
String tail = mDataList.get(mDataList.size() - 1);
mDataList.remove(mDataList.size() - 1);
mDataList.add(0, tail);
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mViewHeight = getMeasuredHeight();
mViewWidth = getMeasuredWidth();
// 按照View的高度计算字体大小
mMaxTextSize = mViewHeight / 7f;
mMinTextSize = mMaxTextSize / 2.2f;
isInit = true;
invalidate();
}
private void init() {
timer = new Timer();
mDataList = new ArrayList<>();
//第一个paint
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Style.FILL);
mPaint.setTextAlign(Align.CENTER);
mPaint.setColor(0xff59B29C);
//第二个paint
nPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
nPaint.setStyle(Style.FILL);
nPaint.setTextAlign(Align.CENTER);
nPaint.setColor(0xff333333);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 根据index绘制view
if (isInit) {
drawData(canvas);
}
}
private void drawData(Canvas canvas) {
// 先绘制选中的text再往上往下绘制其余的text
float scale = parabola(mViewHeight / 4.0f, mMoveLen);
float size = (mMaxTextSize - mMinTextSize) * scale + mMinTextSize;
mPaint.setTextSize(size);
mPaint.setAlpha((int) ((mMaxTextAlpha - mMinTextAlpha) * scale + mMinTextAlpha));
// text居中绘制,注意baseline的计算才能达到居中,y值是text中心坐标
float x = (float) (mViewWidth / 2.0);
float y = (float) (mViewHeight / 2.0 + mMoveLen);
FontMetricsInt fmi = mPaint.getFontMetricsInt();
float baseline = (float) (y - (fmi.bottom / 2.0 + fmi.top / 2.0));
canvas.drawText(mDataList.get(mCurrentSelected), x, baseline, mPaint);
// 绘制上方data
for (int i = 1; (mCurrentSelected - i) >= 0; i++) {
drawOtherText(canvas, i, -1);
}
// 绘制下方data
for (int i = 1; (mCurrentSelected + i) < mDataList.size(); i++) {
drawOtherText(canvas, i, 1);
}
}
/**
* @param position 距离mCurrentSelected的差值
* @param type 1表示向下绘制,-1表示向上绘制
*/
private void drawOtherText(Canvas canvas, int position, int type) {
float d = MARGIN_ALPHA * mMinTextSize * position + type * mMoveLen;
float scale = parabola(mViewHeight / 4.0f, d);
float size = (mMaxTextSize - mMinTextSize) * scale + mMinTextSize;
nPaint.setTextSize(size);
nPaint.setAlpha((int) ((mMaxTextAlpha - mMinTextAlpha) * scale + mMinTextAlpha));
float y = (float) (mViewHeight / 2.0 + type * d);
FontMetricsInt fmi = nPaint.getFontMetricsInt();
float baseline = (float) (y - (fmi.bottom / 2.0 + fmi.top / 2.0));
canvas.drawText(mDataList.get(mCurrentSelected + type * position),
(float) (mViewWidth / 2.0), baseline, nPaint);
}
/**
* 抛物线
*
* @param zero 零点坐标
* @param x 偏移量
*/
private float parabola(float zero, float x) {
float f = (float) (1 - Math.pow(x / zero, 2));
return f < 0 ? 0 : f;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
doDown(event);
break;
case MotionEvent.ACTION_MOVE:
mMoveLen += (event.getY() - mLastDownY);
if (mMoveLen > MARGIN_ALPHA * mMinTextSize / 2) {
if (!loop && mCurrentSelected == 0) {
mLastDownY = event.getY();
invalidate();
return true;
}
if (!loop) {
mCurrentSelected--;
}
// 往下滑超过离开距离
moveTailToHead();
mMoveLen = mMoveLen - MARGIN_ALPHA * mMinTextSize;
} else if (mMoveLen < -MARGIN_ALPHA * mMinTextSize / 2) {
if (mCurrentSelected == mDataList.size() - 1) {
mLastDownY = event.getY();
invalidate();
return true;
}
if (!loop) {
mCurrentSelected++;
}
// 往上滑超过离开距离
moveHeadToTail();
mMoveLen = mMoveLen + MARGIN_ALPHA * mMinTextSize;
}
mLastDownY = event.getY();
invalidate();
break;
case MotionEvent.ACTION_UP:
doUp();
break;
}
return true;
}
private void doDown(MotionEvent event) {
if (mTask != null) {
mTask.cancel();
mTask = null;
}
mLastDownY = event.getY();
}
private void doUp() {
// 抬起手后mCurrentSelected的位置由当前位置move到中间选中位置
if (Math.abs(mMoveLen) < 0.0001) {
mMoveLen = 0;
return;
}
if (mTask != null) {
mTask.cancel();
mTask = null;
}
mTask = new MyTimerTask(updateHandler);
timer.schedule(mTask, 0, 10);
}
class MyTimerTask extends TimerTask {
Handler handler;
public MyTimerTask(Handler handler) {
this.handler = handler;
}
@Override
public void run() {
handler.sendMessage(handler.obtainMessage());
}
}
public interface onSelectListener {
void onSelect(String text,int index);
}
public void setCanScroll(boolean canScroll) {
this.canScroll = canScroll;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
return canScroll && super.dispatchTouchEvent(event);
}
/**
* 控制内容是否首尾相连
*/
public void setIsLoop(boolean isLoop) {
loop = isLoop;
}
}
7.点击效果AnimationUtil:
case R.id.login_confim:
AnimationUtil.setAlpha(loginConfim,0.5f,1f,100);
login();
break;
public class AnimationUtil {
private static View mView;
public static void setAlpha(View view,float x,float y,int time){
mView=view;
view.setAlpha(x);
mHandler.sendEmptyMessageDelayed(0,time);
}
static Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
mView.setAlpha(y);
}
};
}
8.更新下载:
注意因Android10要先在manifest中添加
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.xh.bzwater.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
注意authorities的路径:包名+.fileprovider。还有记得记得记得添加
file_paths:
<resources>
<paths>
<external-path
name="camera_photos"
path="" />
<external-path name="external_files" path="."/>
</paths>
</resources>
然后就是下载代码:
UpdateManager um = new UpdateManager(LoginActivity.this);
um.showDownloadDialog();
最后是下载类UpdateManager:
public class UpdateManager
{
/* 下载中 */
private static final int DOWNLOAD = 1;
/* 下载结束 */
private static final int DOWNLOAD_FINISH = 2;
/* 保存解析的XML信息 */
HashMap<String, String> mHashMap;
/* 下载保存路径 */
private String mSavePath;
/* 记录进度条数量 */
private int progress;
/* 是否取消更新 */
private boolean cancelUpdate = false;
private Context mContext;
/* 更新进度条 */
private ProgressBar mProgress;
private Dialog mDownloadDialog;
private Handler mHandler = new Handler()
{
public void handleMessage(Message msg)
{
switch (msg.what)
{
// 正在下载
case DOWNLOAD:
// 设置进度条位置
mProgress.setProgress(progress);
builder.setMessage("系统正在更新"+progress+"%,请稍候...");
break;
case DOWNLOAD_FINISH:
// 安装文件
installApk();
break;
default:
break;
}
};
};
public UpdateManager(Context context)
{
this.mContext = context;
}
/**
* 显示软件下载对话框
*/
Builder builder;
public void showDownloadDialog()
{
// 构造软件下载对话框
builder = new Builder(mContext);
builder.setTitle("版本更新");
// 给下载对话框增加进度条
final LayoutInflater inflater = LayoutInflater.from(mContext);
View v = inflater.inflate(R.layout.softupdate_progress, null);
mProgress = (ProgressBar) v.findViewById(R.id.update_progress);
builder.setView(v);
builder.setMessage("系统正在更新,请稍候...");
// 取消更新
builder.setNegativeButton("取消", new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
// 设置取消状态
cancelUpdate = true;
}
});
mDownloadDialog = builder.create();
mDownloadDialog.show();
// 现在文件
downloadApk();
}
/**
* 下载apk文件
*/
private void downloadApk()
{
// 启动新线程下载软件
new downloadApkThread().start();
}
/**
* 下载文件线程
*
* @author coolszy
*@date 2012-4-26
*@blog http://blog.92coding.com
*/
private class downloadApkThread extends Thread
{
@Override
public void run()
{
try
{
// 判断SD卡是否存在,并且是否具有读写权限
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
// 获得存储卡的路径
String sdpath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/";
mSavePath = sdpath + "ito";
Log.e("getdata","mSavePath:"+mSavePath);
URL url = new URL(PublicData.loadUrl);
// 创建连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect();
// 获取文件大小
int length = conn.getContentLength();
// 创建输入流
InputStream is = conn.getInputStream();
File file = new File(mSavePath);
Log.e("getdata","File:"+file.getPath());
// 判断文件目录是否存在
if (!file.exists())
{
file.mkdir();
}
File apkFile = new File(mSavePath, "zhihuiyunyingguanli.apk");
Log.e("getdata","apkFile:"+apkFile.getPath());
FileOutputStream fos = new FileOutputStream(apkFile);
int count = 0;
// 缓存
byte buf[] = new byte[1024];
// 写入到文件中
do
{
int numread = is.read(buf);
count += numread;
// 计算进度条位置
progress = (int) (((float) count / length) * 100);
Log.e("getdata","progress:"+progress);
// 更新进度
mHandler.sendEmptyMessage(DOWNLOAD);
if (numread <= 0)
{
// 下载完成
mHandler.sendEmptyMessage(DOWNLOAD_FINISH);
break;
}
// 写入文件
fos.write(buf, 0, numread);
} while (!cancelUpdate);// 点击取消就停止下载.
fos.close();
is.close();
}
} catch (MalformedURLException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
// 取消下载对话框显示
mDownloadDialog.dismiss();
}
};
/**
* 安装APK文件
*/
private void installApk()
{
File apkfile = new File(mSavePath, "zhihuiyunyingguanli.apk");
if (!apkfile.exists())
{
return;
}
// 通过Intent安装APK文件
Intent i = new Intent(Intent.ACTION_VIEW);
if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.N) {
String ufp= mContext.getApplicationInfo().packageName+".fileprovider";
Log.e("okh",ufp);
Uri contentUri = FileProvider.getUriForFile(mContext,ufp,apkfile);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
i.setDataAndType(contentUri,"application/vnd.android.package-archive");
}else{
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");
}
mContext.startActivity(i);
}
}
ProgressBar布局:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="20dp">
<ProgressBar
android:id="@+id/update_progress"
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_margin="0dp"
style="@android:style/Widget.ProgressBar.Horizontal" />
</LinearLayout>
9.图表动态添加颜色:
利用第三方库画图时,一般都需要动态的添加不同的颜色值,而设置颜色值和添加颜色值一般传参都是int,记得需要转换一下(getResources().getColor(R.color.aqi_red))
10.地图添加mark和区域边界
根据功能需求有时地图需要添加许多mark和区域边界,并根据不同的筛选条件需要不断刷新时,可能会出现缺失mark或边界的情况,这种情况下载加载mark或区域边界时最要能另起一个线程,不要在主线程中操作如下图:
11.列表排序
解析代码:
Log.e("getdata", "result:"+result);
//Mapbean bean= JSONObject.parseObject(result,Mapbean.class);
listItem_S = JSON.parseObject(result, new TypeReference<ArrayList<HashMap<String,String>>>(){});
排序代码:
/* MSG 要排序的内容 map
* PAIXUTAG 排序的关键字
*/
public static void paixu(ArrayList<HashMap<String, Object>> MSG, String PAIXUTAG, boolean Shunxu){
final String Mytag = PAIXUTAG;
if(Shunxu){
Collections.sort(MSG, new Comparator<HashMap<String, Object>>() {
@Override
public int compare(HashMap<String, Object> o1, HashMap<String, Object> o2) {
String a = (String) o1.get(Mytag);
String b = (String) o2.get(Mytag);
if(a.endsWith("-")||a.equals("-")){
a="0";
}
if(b.endsWith("-")||b.equals("-")){
b="0";
}
return new Double(a).compareTo(new Double(b));
}
});
}else{
Collections.sort(MSG, new Comparator<HashMap<String, Object>>() {
@Override
public int compare(HashMap<String, Object> o1, HashMap<String, Object> o2) {
String a = (String) o1.get(Mytag);
String b = (String) o2.get(Mytag);
if(a.endsWith("-")||a.equals("-")){
a="0";
}
if(b.endsWith("-")||b.equals("-")){
b="0";
}
return new Double(b).compareTo(new Double(a));
}
});
}
}
这个排序参数根据你自己的解析结果排序,如:
12.动态修改图标背景颜色
代码如下:
public View getview(int bitmap, String pm_val, String color) {
View view = LayoutInflater.from(this).inflate(R.layout.map_info_view, null);
LinearLayout ll_bg = view.findViewById(R.id.ll_bg);
TextView tv_value = view.findViewById(R.id.tv_value);
//tv_value.setTextColor(0xffffffff);
tv_value.setText(pm_val);
ll_bg.setBackgroundResource(bitmap);
int tint = Color.parseColor(color);
ll_bg.getBackground().setColorFilter(tint, PorterDuff.Mode.SRC_IN);
return view;
}
主要代码为:
int tint = Color.parseColor(color);
ll_bg.getBackground().setColorFilter(tint, PorterDuff.Mode.SRC_IN);
PorterDuff.Mode是设置新背景颜色与图片背景颜色相交模式,有兴趣的同学可以执行实验,我选的是直接覆盖。