自定义我的页面类+日期选择器,动态获取6.0动态权限

写一个类继承ScrollView

public class Custom extends ScrollView {
private static final String TAG = "BounceScrollView";
private float mFirstPosition = 0;
private Boolean mScaling = false;
private View dropZoomView;//需要被放大的view
private int dropZoomViewWidth;
private int dropZoomViewHeight;
private View inner;// 子View
private float y;// 点击时y坐标
private Rect normal = new Rect();// 矩形(这里只是个形式,只是用于判断是否需要动画.)
private boolean isCount = false;// 是否开始计算
private float lastX = 0;
private float lastY = 0;
private float currentX = 0;
private float currentY = 0;
private float distanceX = 0;
private float distanceY = 0;
private boolean upDownSlide = false;

public Custom(Context context) {
    super(context);
}

public Custom(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public Custom(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

//初始化
private void init() {
    setOverScrollMode(OVER_SCROLL_NEVER);
    if (getChildAt(0) != null) {
        inner = getChildAt(0);//这个是底部收缩的view
        //头部收缩的
        ViewGroup vg = (ViewGroup) getChildAt(0);
        if (vg.getChildAt(0) != null) {
            dropZoomView = vg.getChildAt(0);
        }
    }
}

/***
 * 生成视图工作完成.该函数在生成视图的最后调用,在所有子视图添加完之后. 即使子类覆盖了 onFinishInflate
 * 方法,也应该调用父类的方法,使该方法得以执行.
 */
@Override
protected void onFinishInflate() {
    //初始化
    init();
    super.onFinishInflate();
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    //这里只是计算尾部坐标
    currentX = ev.getX();
    currentY = ev.getY();
    switch (ev.getAction()) {
        case MotionEvent.ACTION_MOVE:
            distanceX = currentX - lastX;
            distanceY = currentY - lastY;
            if (Math.abs(distanceX) < Math.abs(distanceY) && Math.abs(distanceY) > 12) {
                upDownSlide = true;
            }
            break;
    }
    lastX = currentX;
    lastY = currentY;
    if (upDownSlide && inner != null) {
        commOnTouchEvent(ev);
    }
    return super.dispatchTouchEvent(ev);
}
/***
 * 触摸事件
 *
 * @param ev
 */
public void commOnTouchEvent(MotionEvent ev) {
    //头部缩放计算
    if (dropZoomViewWidth <= 0 || dropZoomViewHeight <= 0) {
        dropZoomViewWidth = dropZoomView.getMeasuredWidth();
        dropZoomViewHeight = dropZoomView.getMeasuredHeight();
    }
    switch (ev.getAction()) {
        case MotionEvent.ACTION_UP:
            //手指离开后头部恢复图片
            mScaling = false;
            replyImage();
            // 手指松开尾部恢复
            if (isNeedAnimation()) {
                animation();
                isCount = false;
            }
            clear0();
            break;
        //这里头尾分开处理,互不干扰
        case MotionEvent.ACTION_MOVE:
            //尾部处理
            final float preY = y;// 按下时的y坐标
            float nowY = ev.getY();// 时时y坐标
            int deltaY = (int) (preY - nowY);// 滑动距离
            if (!isCount) {
                deltaY = 0; // 在这里要归0.
            }
            y = nowY;
            // 当滚动到最上或者最下时就不会再滚动,这时移动布局
            if (isNeedMove()) {
                // 初始化头部矩形
                if (normal.isEmpty()) {
                    // 保存正常的布局位置
                    normal.set(inner.getLeft(), inner.getTop(),
                            inner.getRight(), inner.getBottom());
                }
                // 移动布局
                inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2,
                        inner.getRight(), inner.getBottom() - deltaY / 2);
            }
            isCount = true;
            //尾部处理end
            //头部处理
            if (!mScaling) {
                if (getScrollY() == 0) {
                    mFirstPosition = ev.getY();// 滚动到顶部时记录位置,否则正常返回
                } else {
                    break;
                }
            }
            int distance = (int) ((ev.getY() - mFirstPosition) * 0.6); // 滚动距离乘以一个系数
            if (distance < 0) { // 当前位置比记录位置要小,正常返回
                break;
            }
            // 处理放大
            mScaling = true;
            setZoom(1 + distance);
            //头部处理end
            break;
    }
}
/***
 * 回缩动画,尾部往下缩动画
 */
public void animation() {
    // 开启移动动画
    TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(),
            normal.top);
    ta.setDuration(200);
    inner.startAnimation(ta);
    // 设置回到正常的布局位置
    inner.layout(normal.left, normal.top, normal.right, normal.bottom);
    normal.setEmpty();
}
// 是否需要开启动画
public boolean isNeedAnimation() {
    return !normal.isEmpty();
}
// 回弹动画,header往上缩动画 (使用了属性动画)
public void replyImage() {
    final float distance = dropZoomView.getMeasuredWidth() - dropZoomViewWidth;
    // 设置动画
    ValueAnimator anim = ObjectAnimator.ofFloat(0.0F, 1.0F).setDuration((long) (distance * 0.7));
    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            float cVal = (Float) animation.getAnimatedValue();
            setZoom(distance - ((distance) * cVal));
        }
    });
    anim.start();
}
//头部缩放
public void setZoom(float s) {
    if (dropZoomViewHeight <= 0 || dropZoomViewWidth <= 0) {
        return;
    }
    ViewGroup.LayoutParams lp = dropZoomView.getLayoutParams();
    lp.width = (int) (dropZoomViewWidth + s);
    lp.height = (int) (dropZoomViewHeight * ((dropZoomViewWidth + s) / dropZoomViewWidth));
    dropZoomView.setLayoutParams(lp);
}
/***
 * 是否需要移动布局 inner.getMeasuredHeight():获取的是控件的总高度
 *
 * getHeight():获取的是屏幕的高度
 *
 * @return
 */
public boolean isNeedMove() {
    int offset = inner.getMeasuredHeight() - getHeight();
    int scrollY = getScrollY();
    // 0是顶部,后面那个是底部
    if (scrollY == 0 || scrollY == offset) {
        return true;
    }
    return false;
}
//清理尾部属性值
private void clear0() {
    lastX = 0;
    lastY = 0;
    distanceX = 0;
    distanceY = 0;
    upDownSlide = false;
}
}

在activity点击获取日期的方法中

//收起软键盘
protected void hideInput() {
    InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
    View v = getWindow().peekDecorView();
    if (null != v) {
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
    }
}

//日期选择的点击事件
@OnClick(R.id.reg_date)
public void dateOnClick()
{
    hideInput();
    Calendar selectedDate = Calendar.getInstance();
    Calendar calendar = Calendar.getInstance();
    final int year = calendar.get(Calendar.YEAR);
    final int month = calendar.get(Calendar.MONTH);
    final int day = calendar.get(Calendar.DAY_OF_MONTH);

    Calendar startDate = Calendar.getInstance();
    Calendar endDate = Calendar.getInstance();

    startDate.set(year-100,0,1);
    endDate.set(year,month,day);
    TimePickerView pvTime = new TimePickerBuilder(this, new OnTimeSelectListener() {
        @Override
        public void onTimeSelect(Date date, View v) {
            SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            String time = sDateFormat.format(date);
            regDate.setText(time+"");
        }
    })
            .setType(new boolean[]{true, true, true, false, false, false})
            // 默认全部显示
            .setCancelText("取消")
            //取消按钮文字
            .setSubmitText("确定")
            //确认按钮文字
            .setOutSideCancelable(true)
            //点击屏幕,点在控件外部范围时,是否取消显示
            .setRangDate(startDate,endDate)
            //起始终止年月日设定
            .isCenterLabel(false)
            .setDate(selectedDate)
            //是否只显示中间选中项的label文字,false则每项item全部都带有label。
            .build();
    pvTime.show();

}
//日期的转换
private String getTime(Date date) {
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    return format.format(date);
}

动态获取6.0动态权限

if(Build.VERSION.SDK_INT>=23){
                String[] mPermissionList = new String[]{Manifest.permission.ACCESS_COARSE_LOCATION};
                ActivityCompat.requestPermissions(getActivity(),mPermissionList,123);
            }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值