关于Android自定义控件的学习

来源:互联网 发布:滴定分析数据意思 编辑:程序博客网 时间:2024/05/21 14:50

参考博客:http://blog.csdn.net/vipzjyno1/article/details/24664161

知识点:Scroll的简单使用

scrollTo的使用

在view.post里面可以获取到控件高度




View的代码

package com.example.testdemo03.view2;import android.content.Context;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.view.animation.BounceInterpolator;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.Scroller;import com.example.testdemo03.R;public class CurtainView extends RelativeLayout implements OnTouchListener {public CurtainView(Context context) {super(context);init(context);}public CurtainView(Context context, AttributeSet attrs) {super(context, attrs);init(context);}public CurtainView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init(context);}Context mContext;Scroller mScroller;//ImageView ivCurtainHead;//头部ImageView ivCurtainCord;//绳子int ivCurtainHeadHeight;//头部高度private void init(Context context) {this.mContext = context;mScroller = new Scroller(mContext, new BounceInterpolator());View view = LayoutInflater.from(mContext).inflate(R.layout.curtain_view, null);ivCurtainHead = (ImageView) view.findViewById(R.id.ivCurtainHead);ivCurtainCord = (ImageView) view.findViewById(R.id.ivCurtainCord);ivCurtainHead.post(new Runnable() {//获取头部的高度,并且将整个view移动到头部高度的位置,刚好隐藏头部@Overridepublic void run() {ivCurtainHeadHeight = ivCurtainHead.getHeight();CurtainView.this.scrollTo(0, ivCurtainHeadHeight);}});addView(view);ivCurtainCord.setOnTouchListener(this);}boolean isMove = false;//是否正在移动boolean isOpen = false;//是否打开@Overridepublic void computeScroll() {//由父视图调用用来请求子视图根据偏移值 mScrollX,mScrollY重新绘制 if (mScroller.computeScrollOffset()) {//调用该方法判断滚动是否还在继续isMove = true;scrollTo(mScroller.getCurrX(), mScroller.getCurrY());invalidate();//刷新控件} else {isMove = false;}super.computeScroll();}private void startMoveWithAnim(int startY, int dY, int duration) {//设置移动动画isMove = true;mScroller.startScroll(0, startY, 0, dY, duration);postInvalidate();}private void onClick() {//当滑动范围太小的时候就是点击if (isOpen) {startMoveWithAnim(0, ivCurtainHeadHeight, 300);} else {startMoveWithAnim(ivCurtainHeadHeight, -ivCurtainHeadHeight, 500);}isOpen = !isOpen;}int downY = 0;//点击的点y坐标int scrollY = 0;//拖动时y的方向距离int moveY = 0;//移动的点y坐标int upY = 0;//松开的点y坐标@Overridepublic boolean onTouch(View v, MotionEvent event) {// int offViewY = 0;switch (event.getAction()) {case MotionEvent.ACTION_DOWN:downY = (int) event.getRawY();// 相对于屏幕的距离// offViewY = downY - (int) event.getY();// view的顶端距屏幕顶端的距离System.out.println(downY + "<-------->" + event.getY());return true;case MotionEvent.ACTION_MOVE:moveY = (int) event.getRawY();scrollY = moveY - downY;System.out.println("scrollY-------->" + scrollY);if (scrollY > 0) {// 往下移动if (!isOpen) {if (scrollY <= ivCurtainHeadHeight) {scrollTo(0, ivCurtainHeadHeight - scrollY);}}} else {// 往上移动if (isOpen) {// System.out.println((ivCurtainHead.getBottom() -// offViewY)+"<--->"+ivCurtainHeadHeight);if (-scrollY <= ivCurtainHeadHeight) {scrollTo(0, -scrollY);}}}break;case MotionEvent.ACTION_UP:upY = (int) event.getRawY();if (Math.abs(upY - downY) < 10) {onClick();break;}System.out.println(getScrollY() + "<----->" + scrollY);if (upY > downY) {// 往下模式if (!isOpen) {if (getScrollY() > ivCurtainHeadHeight / 2) {// 整个view的scrollY,没有拉到一半的模式startMoveWithAnim(getScrollY(), ivCurtainHeadHeight- getScrollY(), 300);isOpen = false;} else {startMoveWithAnim(getScrollY(), -getScrollY(), 300);isOpen = true;}}} else {// 往上if (isOpen) {if (getScrollY() < ivCurtainHeadHeight / 2) {startMoveWithAnim(getScrollY(), -getScrollY(), 300);isOpen = true;} else {startMoveWithAnim(getScrollY(), ivCurtainHeadHeight- getScrollY(), 300);isOpen = false;}}}break;default:break;}return false;}}


0 0