gpt4 book ai didi

java - 刷新时Android自定义 View 移回原始位置

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:11:50 26 4
gpt4 key购买 nike

我正在实现一个如下所示的时间选择器:

unfinished time picker

那个黄色 block 是 MyCustomView。移动 MyCustomView 时,我应该计算新日期并设置 tvDate

部分布局文件:

<LinearLayout 
android:orientation="vertical">

<TextView android:id="@+id/tv_date">

<RelativeLayout
android:id="@+id/rl">

<MyCustomView
android:layout_centerInParent="true"/>

<OtherViews/>
</RelativeLayout>
</LinearLayout>

代码:

class MyCustomView extends View{

// move listener
public interface IMoveCallback{
void update(int index);
}

private IMoveCallback listener = null;

// set listener
public void setMoveCallback(IMoveCallback callback){
this.listener = callback;
}

@Override
protected void onDraw(Canvas c){
super.onDraw(c);
// draw yellow block and four arrows here.
}

@Override
public boolean onTouch(View v, MotionEvent event) {
processDrag(v, event);
invalidate();
return false;
}

private void processDrag(View v, MotionEvent event){
// calculate new position(left, top, right, bottom)
v.layout(newLeft, newTop, newRight, newBottom);
if(listener != null){
// calculate index by new position
listener.update(index);
}
}
}

class MainActivity extends Activity implements MyCustomView.IMoveCallback{

MyCustomView view; // view.setMoveCallback(MainActivity.this)

@Override
public void update(int index){
tvDate.setText(String.valueOf(System.currentTimeMillis()))//update tvDate
}
}

如果 tvDate.setText() 被移除,MyCustomView 会跟随手指,如下所示:

enter image description here

如果我更新 tvDateMyCustomView 将移回 rl 的中心:

enter image description here

我认为这不是 Activity 生命周期问题。有人提到了 ((MarginLayoutParams)rl.getLayoutParams()).topMargin 但没有解释原因。 任何人都可以帮助我吗?

最佳答案

您的解决方案是在 TextView.setText() setText( ) 在布局或传递左、右、...的值之前

private void processDrag(View v, MotionEvent event){       
if(listener != null){
// calculate index by new position
listener.update(index);
}
// calculate new position(left, top, right, bottom)
v.layout(newLeft, newTop, newRight, newBottom);
}
//i think you should take out invalidate() in your onTouch()

为什么? TextView.setText() 同时触发 invalidaterequestLayout() 以强制快速布局,但是 Invalidate() 只是告诉它的父级它是脏的,所以它需要做一个自上而下的布局过程。

(我很困惑,所以我不会继续支持它,所以我跳了)。您的 TextView 位于父布局内,父布局的孙子是您的自定义 View ,而 invalidate() 重新放置所有这些布局,因此将您的自定义 View 发送回其位置,但是,如果您排除它,并在您的自定义 View 中调用显式 invalidate(),它会告诉它的父级它发生了脏的和相同的过程,但这次仅使用 RelativeLayout

用户:Zaid Qureshi 已经向您说明了这一点。

此外,我不知道您是否知道提供给您的 customView 的 layoutParams 来自您控制不多但操作系统的父级,而注入(inject)的 Params 用于布局和为您的填充等提供填充等查看,因为您没有布置它们而只是传递位置。

希望我对你有帮助&它对你有帮助

关于java - 刷新时Android自定义 View 移回原始位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35882755/

26 4 0