【问题标题】:Custom View onDraw method SOMETIMES Not Called自定义视图 onDraw 方法有时未调用
【发布时间】:2015-04-10 08:16:47
【问题描述】:

当在 viewpager 中发生页面滑动时,我正在绘制一个滑块。所以我在 ViewPager onPageChange 事件中绘制它。问题是; onDraw 方法(有时)没有被调用。 相同的代码适用于其他项目,但不适用于本项目,这让事情变得更奇怪了。

我的 SliderBar 视图类;

public class SliderBar extends View {

Paint p = new Paint();
int startX;
int width;
Rect r = new Rect();

public SliderBar(Context c,int x,int width){
    super(c);
    this.startX = x;
    this.width = width;
    this.setWillNotDraw(false);// these didnt fix
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    p.setColor(Color.parseColor("#bbbbbbbb"));
    p.setAntiAlias(true);
    p.setStyle(Paint.Style.FILL);

    r.set(startX,0,startX+width,500);

    canvas.drawRect(r,p);

 }
}

我的通话位置

cvp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            int width = cvp.getWidth()/btnCount;
            int currentPos = cvp.getCurrentItem();
            int startX;
            if(currentPos> position)
                startX = (currentPos-1) * width - (cvp.getWidth()-positionOffsetPixels)/btnCount;
            else
                startX = (currentPos-1) * width + positionOffsetPixels/btnCount;

            SliderBar dsb = new SliderBar(getBaseContext(),startX,width);
            ll.removeAllViews();
            ll.addView(dsb,lp);
            ll.invalidate(); // these didnt fix
            mainLayout.invalidate();// these didnt fix
        }

        @Override
        public void onPageSelected(int position) {}

        @Override
        public void onPageScrollStateChanged(int state) {}
    });

  My LinearLayout
        android:layout_width="match_parent" android:orientation="vertical"
        android:background="#77000000"
        android:layout_height="0dp"
        android:layout_weight="1" android:id="@+id/ll"

【问题讨论】:

  • 什么是ll?什么是主布局?为什么每次调用 onPageScrolled 时都创建和添加 SliderBar?
  • 因为每次出现幻灯片帧时,我都会为页面幻灯片事件更新滑块视图。此代码适用于其他项目而不是这个项目。 mainLayout 是主布局,ll 是我添加视图的地方。它仅在滚动事件空闲或完成时更新视图

标签: android view android-viewpager android-linearlayout


【解决方案1】:

尝试在您的意图中添加标志FLAG_ACTIVITY_NO_ANIMATION

Intent intent = new Intent(SourceActivity.this, TargetActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);

Issue related commit on google source

【讨论】:

    【解决方案2】:

    View#invalidate() 可能在 Activity 执行窗口动画时不起作用。所以FLAG_ACTIVITY_NO_ANIMATION 可以解决您的问题。 在我的情况下,onDraw() 方法在动画帧更新期间不会调用。

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多