拖动视图显示差事行为

时间:2014-01-06 13:13:29

标签: android android-layout

我通过调用offsetTopandBottom(int distanceY)来抵消Action_MOVE上的imageview,并且在每次调用后也会失效。

但是框架是可见的,同时在Froyo和Gingerbread上拖动视图。有什么建议吗?

/**
 * Called on ACTION_MOVE
**/
private void offsetView(View view, int distanceY) {
    view.offsetTopAndBottom(distanceY);
    view.invalidate();              
    view.invalidateDrawable(view.getBackground());
}   

我也试过在每个offsetCall上发帖,但它没有用。

post(new Runnable() {
    @Override
    public void run() {
            view.offsetTopAndBottom(distanceY);
    view.invalidateDrawable(getBackground());
    view.invalidate();  
    }
});

我应该使用postDelayed进行重绘,还是应该延迟调用offsetTopAndBottom(int offset)?

解决:

分开执行绘图和偏移调用10ms(或其他时间<60ms)。

view.offsetTopAndBottom(distanceY);
postDelayed(new Runnable() {
    @Override
    public void run() {
    view.invalidateDrawable(getBackground());
    view.invalidate();  
    }
}, 10);

谢谢格雷格:)

enter image description here

1 个答案:

答案 0 :(得分:2)

默认情况下,Android 3.1之前未启用硬件加速。

android:hardwareAccelerated="true"添加到您的清单中,用于活动或应用程序。


更新:如果这不起作用,我认为Android延迟重绘,直到你的UI线程空闲,但在你的情况下它不会因为你经常处理触摸事件而闲置。因此,您应该尝试发布到处理程序而不是立即绘制,以便为操作系统提供重绘的机会。

试试这个:

Handler h = new Handler();
private void offsetView(View view, int distanceY) {
    h.post(new Runnable() {
        @Override
        public void run() {
           view.offsetTopAndBottom(distanceY);
           view.invalidate();              
           view.invalidateDrawable(view.getBackground());
        }
    });
}