在scrollView中绘制画布线时出现问题

时间:2020-03-14 21:46:04

标签: java android canvas scrollview

我正在尝试绘制可滚动的时间轴。我实现了singleLine自定义视图,以便在回收站视图的圆形ImageView之间绘制一条线:

public class SingleLine extends View {
    WeakReference<Context> ctx;
    Paint paint;
    PointF pointA, pointB;
    private int height_custom;

    public SingleLine(Context context) {
        super(context);
        ctx = new WeakReference<>(context);
        init();
    }

    public SingleLine(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        ctx = new WeakReference<>(context);
        init();
    }

    public void init() {
        paint = new Paint();
        pointA = new PointF();
        pointB = new PointF();
        paint.setStrokeWidth(10);
        paint.setColor(ctx.get().getResources().getColor(R.color.green));
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawLine(pointA.x, pointA.y, pointB.x, pointB.y, paint);
        invalidate();
    }

    public PointF getPointA() {return pointA;}

    public void setPointA(PointF pointA) {this.pointA = pointA;}

    public PointF getPointB() {return pointB;}

    public void setPointB(PointF pointB) {this.pointB = pointB;}
}

在我适配器的onBindViewHolder()方法中,我使用一个接口来测量recyclerview的第一个和最后一个可见视图的x / y坐标:

@Override 
public void onBindViewHolder(@NonNull final TaskViewHolder holder, final int position) {
    Tasks tasks = datalist_tasks.get(position);
    String hour = "" + tasks.getHour() + ":" + tasks.getMinute();
    holder.tv_clock.setText(hour);
    holder.tv_title.setText(tasks.getTitle());
    holder.tv_comment.setText(tasks.getComment());

    holder.itemView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
                holder.itemView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            else
                holder.itemView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            if (iOnMeasureCustomView != null)
                iOnMeasureCustomView.onMeasure(holder.iv_status, position);
        }
    });
}

然后在我的活动中实现该接口,如下所示:

LinearLayoutManager layoutManager1 = new LinearLayoutManager(_C.get(), RecyclerView.VERTICAL, false);
rv_tasks.setLayoutManager(layoutManager1);
tasksAdapter.setiOnMeasureCustomView(new IOnMeasureCustomView() {
    @Override
    public void onMeasure(ImageView iv_status, int position) {
        int[] screen = new int[2];
        iv_status.getLocationOnScreen(screen);
        int width = (int) ((iv_status.getWidth() / 2) + convertDpToPixel(8));
        if (position == layoutManager1.findFirstCompletelyVisibleItemPosition()) {
            pointA.set(iv_status.getX() + width, iv_status.getY() + convertDpToPixel(8));
        } 
        else if (position == layoutManager1.findLastCompletelyVisibleItemPosition()) {
            pointB.set(iv_status.getX() + width, screen[1] - convertDpToPixel(40));
            singleLine.setPointA(pointA);
            singleLine.setPointB(pointB);        
            singleLine.invalidate();
        }
    }
});

我还为自己的recyclerview实现addOnScrollListener()并编写此代码段(我不知道此实现是否正确):

rv_tasks.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
         PointF a = singleLine.getPointA();
         PointF b = singleLine.getPointB();
         if (dy > 0) {
            a.y -= dy;
            b.y -= dy;
            singleLine.setPointA(a);
            singleLine.setPointB(b);
            singleLine.invalidate();
        } else {
            a.y += Math.abs(dy);
            b.y += Math.abs(dy);
            singleLine.setPointA(a);
            singleLine.setPointB(b);
            singleLine.invalidate();
        }
    }
});

我的问题是,当我滚动活动时(如下面的gif所示),我的singleLine就像切断imageView一样,并且行的结尾x / y变为屏幕末尾的x / y。

enter image description here

enter image description here

Questios

  1. 如何设置行的x / y以防止这种情况?
  2. 在绘制带有动画的线条时,我还需要一些帮助。如何用活动开始时开始的动画绘制这条线?

0 个答案:

没有答案
相关问题