是可以设置颜色的,但是没有细说这个问题,自己想一下吧
不是的,是要按加的增,
//下拉View public class PullDownView extends View { private float mProgress; Paint mCirclePaint; private int mCircleRadius = 150; private int mCircleRadiuX, mCircleRadiuY; //可拖动的高度 private int mDragHeight = 800; public PullDownView(Context context) { super(context); init(); } public PullDownView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } public PullDownView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public PullDownView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } private void init() { Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); //设置抗锯齿 paint.setAntiAlias(true); //设置防抖 paint.setDither(true); //设置填充方式 paint.setStyle(Paint.Style.FILL); paint.setColor(0xff000000); mCirclePaint = paint; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawCircle(mCircleRadiuX, mCircleRadiuY, mCircleRadius, mCirclePaint); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // super.onMeasure(widthMeasureSpec, heightMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int width = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); int minWidth = 2*mCircleRadius+getPaddingLeft()+getPaddingRight(); int minHeight = (int) ((mDragHeight*mProgress +0.5f)+getPaddingTop()+getPaddingBottom()); int measureWidth, measureHeight; if (widthMode == MeasureSpec.EXACTLY){ //确定的值 measureWidth = width; } else if (widthMode == MeasureSpec.AT_MOST){ //最多的值 measureWidth = Math.min(minWidth, width); } else { measureWidth = minWidth; } if (heightMode == MeasureSpec.EXACTLY){ //确定的值 measureHeight = height; } else if (heightMode == MeasureSpec.AT_MOST){ //最多的值 measureHeight = Math.min(minHeight, height); } else { measureHeight = minHeight; } //设置宽高 setMeasuredDimension(measureWidth, measureHeight); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mCircleRadiuX = getWidth()>>1; mCircleRadiuY = getHeight()>>1; } /** * 设置拖动进度 * @param progress */ public void setProgress(float progress){ Log.e("TAG", "p"+progress); mProgress = progress; requestLayout(); } } //RelativeLayout下拉监听 final PullDownView pullDownView = findViewById(R.id.pulldown); findViewById(R.id.activity_main).setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { int action = motionEvent.getAction(); switch (action){ case MotionEvent.ACTION_DOWN: mTouchMoveStartY = motionEvent.getY(); return true; case MotionEvent.ACTION_MOVE: float y = motionEvent.getY(); if (y>=mTouchMoveStartY){ float moveSize = y - mTouchMoveStartY; float progress = moveSize>= TOUCH_MOVE_MAX_Y? 1: moveSize/TOUCH_MOVE_MAX_Y; pullDownView.setProgress(progress); } return true; case MotionEvent.ACTION_UP: break; } return false; } }); //Xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:top="http://schemas.android.com/apk/res-auto" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#fff"> <com.summer.h5.View.PullDownView android:id="@+id/pulldown" android:layout_width="match_parent" android:layout_height="wrap_content"/> </RelativeLayout>
发现问题了,原来是没有添加线程
这个只是为了四舍五入而已,比如mDragHeight * progress = 1.5f时,当没有加上0.5f时,转int时就为1,当加上0.5f时,就为2.0f转int时就为2,满足四舍五入了
可能是你的版本设置的太低了
光标移动到红线处 按住ALT+Enter提示 就会出来教程里面的选择第一个constructor那个 就会出来选择构造方法的界面
我也是这样的 拉动后没反应
是代码块吧,,
这个是可以设置代码块弄的吧
放在MotionEvent.ACTION_UP中
通常会把参数t当作时间,那么曲线长度随t的变化率也就称作曲线的速率。就是说如果对于P(t)求导就是得到的函数就是t时刻的速度
Drawable drawable=mContent;
if (drawable!=null){
canvas.save();
//剪切矩形区域
canvas.clipRect(drawable.getBounds());
canvas.rotate(mRotate,mCirclePointX,mCirclePointY);
drawable.draw(canvas);
}
canvas的rotate(float,float,float)方法是旋转画布
第一个参数:旋转角度(0~无穷)
第二个参数:旋转中心点x坐标
第三个参数:旋转中心点y坐标
请在setOnTouchListener的MotionEvent.ACTION_UP时候调用mPullDownView.release(),release();就是写在自定义view中的那个值动画函数
public void release() {
if (valueAnimator == null){
valueAnimator = ValueAnimator.ofFloat(mProgress,0);
valueAnimator.setDuration(300);
valueAnimator.setInterpolator(new DecelerateInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Object value = animation.getAnimatedValue();
if (value instanceof Float){
setProgress((Float) value);
}
}
});
}else {
valueAnimator.cancel();
valueAnimator.setFloatValues(mProgress,0);
}
valueAnimator.start();
}
我整理了一下,不过是分开的文件,不是工程,需要的话可以下载。
http://pan.baidu.com/s/1pLt2TQF
SketchBook
有,自定义view,和工具无关
确实是相当于float[] values,调用时传入的参数会被自动放入一个数组;并且声明时float... values 必须是最后一个参数。
参考: https://stackoverflow.com/questions/7539033/java-multiple-arguments-dot-notation-varargs
我在自己敲,目前敲到3-2
我最开始见到这种“动画”效果的时候,我想到的是外层肯定是有一系列的点连起来的曲线,决定这个曲线的点肯定遵循了某种算法进行分布。我当时只想到了这里,至于用了什么算法当时只是随便搜了一下,搜到了贝塞尔曲线,但是当时没研究怎么实现的。
我整理了一下,不过是分开的文件,不是工程,需要的话可以下载。
http://pan.baidu.com/s/1pLt2TQF
你可以对比一下
在case MotionEvent.ACTION_DOWN:
要处理的事
return true;(表示消费了这个事件)
move事件也是如此
这句代码是指view的绘制区域随着进度的不断改变而改变,最开始是整个屏幕宽度,到最后的mTargetWidth。宽度一直在减少