我正在实现一个如下所示的时间选择器:
该黄色块是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
跟随手指,如下所示:如果我更新
tvDate
,MyCustomView
将移回到rl
的中心:我认为这不是 Activity 生命周期的问题。有人提到
((MarginLayoutParams)rl.getLayoutParams()).topMargin
,但没有解释原因。有人可以帮助我吗?
最佳答案
您需要保存视图的位置,并在 Activity 恢复(从家回来)或开始(按回去之后)时在同一位置渲染它。 This Picture显示了您可以重写以实现此目的的方法,例如失去焦点时的onPause等。
编辑
从外观上看,它正在重置为原始状态。发布有关您如何设置位置等的更多信息。如果这是您要移动的视图。然后实现on drag listener而不是该更新。让我知道如何解决。