如何解决ScrollView快速滚动时的闪烁问题

 我来答
点点通软件公司
2016-12-07 · TA获得超过922个赞
知道小有建树答主
回答量:650
采纳率:89%
帮助的人:148万
展开全部
  1、当我们在Activity里面获得View对象的时候,无论是getMeasuredHeight()还是getHehgit()方法(放在Activity里的onCreate,onStart,onResum),返回值一律为零。

  2、无法使ScrollView的内容从最底部开始向上滑动(一开始ScrollView为空白,但是内容由下向上慢慢上移)

  3、对ScrollView的scrollBy与scrollTo方法区别不是太熟悉;

  在网上查询资料:

  1. 在一个类初始化时,即在构造函数当中是得不到View的实际大小的(这个我测试过,的确)。大家可以试试,getWidth()和getMeasuredWidth()得到的结果都是0,但是可以从onDraw()方法或者dispatchDraw()方法里面获得。可以通过调用invalidate()来执行onDraw()和dispatchDraw()方法。

  2. 这两个方法所得到的结果的单位是像素即pixel

  getWidth(): View在设定好布局后,整个View的宽度

  getMeasuredWidth():对View上的内容进行测量后得到的View内容占据的宽度。前提是你必须在父布局的onLayout()方法或者此View的onDraw()方法里调用measure(0,0);(measure参数的值可以知己定义),否则得到的结果和getWidth()得到的结果是一样的。

  这两个方法最主要的区别在于,是否使用了measure()方法,同时measure()使用的位置也很重要。

  getHeight() 和 get MeasuredHeight() 区别同理。

  经过我的测试(不知道有没有别的方法),ScrollView是不能开始就显示在最底层的,只能在最上面添加一个控件,这里我添加了一个TextView空的空间,这样在开始显示的ScrollView的时候,是空的,感觉是内容慢慢开始向上移动

  scrollTo() 是直接指定滚动条的位置, 但是由于这个动作不是单纯关于 ScrollView 而已, 还要根据 ScrollView 里面包含的View 的实际信息. 所以这动作必须在页面加载完成以后才能执行. 在Activity 初始化过程中, 要指定滚动条位置, 必须用下面的代码

  sView.post(new Runnable() {

  @Override

  public void run() {

  sView.scrollTo(sViewX, sViewY);

  }

  });

  滚动代码如下:

  public class MainActivity extends Activity {

  private final Handler mHandler = new Handler();

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  iniHolder();

  }

  private void iniHolder() {

  Holder.scroll = (ScrollView) findViewById(R.id.sv_scroll);

  Holder.mlayout = (LinearLayout) findViewById(R.id.l_test);

  Holder.tv_null = (TextView) findViewById(R.id.tv_null);

  Holder.tv_null.setHeight(getWindowManager().getDefaultDisplay()

  .getHeight() - 50);

  }

  @Override

  protected void onResume() {

  super.onResume();

  System.out.println成都软件开发公司http://www.yingtaow.com?Holder.mlayout.getMeasuredHeight() + ":"

  + Holder.scroll.getHeight());

  Holder.scroll.post(ScrollRunnable);

  }

  private Runnable ScrollRunnable = new Runnable() {

  @Override

  public void run() {

  int off = Holder.mlayout.getMeasuredHeight()

  - Holder.scroll.getHeight();// 判断高度,ScrollView的最大高度,就是屏幕的高度

  if (off > 0) {

  Holder.scroll.scrollBy(0, 2);

  if (Holder.scroll.getScrollY() == off) {

  Thread.currentThread().interrupt();

  } else {

  mHandler.postDelayed(this, 10);

  }

  }

  }

  };

  static class Holder {

  static ScrollView scroll;

  static LinearLayout mlayout;

  static TextView tv_null;

  }

  }
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式