Android中View移动的几种方式

1. offsetLeftAndRight() 和 offsetTopAndBottom() (推荐)

  • 实现的是对view的移动
  • offsetLeftAndRight(int offset): 水平方向挪动View,offset为正则x轴正向移动,getLeft()和getRight()会变
  • offsetTopAndBottom(int offset): 垂直方向挪动View,offset为正则y轴正向移动,getTop()和getBottom会变

2. scrollBy() 和 scrollTo() (推荐)

  • 对View内容的移动
  • scrollBy() :位移指定的偏移量
  • scrollTo() :位置到指定的位置

3. translationX 和 translationY

  • 实现的是对view的移动
  • 相对于left,top,在view的平移过程中,left和top始终等于view初始状态时的值,只是x,y和translationX,translationY会发生改变,
  • translationX:代表View平移的水平距离;
  • translationY:代表View平移的垂直距离;

4.更改LayoutParams属性(不推荐)

示例

表示将view向右移动了100px

MarginLayoutParams params = (MarginLayoutParams) mButton.getLayoutParams();
params.leftMargin += 100;
// 请求重新对View进行measure、layout
mButton.requestLayout();

5.使用Scroller来实现平滑滑动

示例(模板代码)

本质依旧是调用了scrollTo()方法

Scroller scroller = new Scroller(mContext); 

private void smoothScrollTo(int dstX, int dstY) {
  int scrollX = getScrollX();
  int scrollY = getScrollY();
  int deltaX = dstX - scrollX;
  int deltaY = dstY - scrollY;
  scroller.startScroll(scrollX, scrollY, deltaX, deltaY, 1000); 
  invalidate(); 
}

@Override
public void computeScroll() {
  if (scroller.computeScrollOffset()) { 
    scrollTo(scroller.getCurrX(), scroller.getCurY());
    // 用于在非UI线程中更新用户界面
    postInvalidate();
  }
}
  1. 调用smoothScrollTo()方法开始执行滚动
  2. invalidate() 回调computeScroll()
  3. computeScroll()中的computeScrollOffset()方法为CurrX和CurrY赋值,如果动画未执行完成,返回true,否则返回false
  4. postInvalidate() 中再次调用computeScroll(),直至动画完成,实现平滑移动

6.使用属性动画

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android ,焦点移动可以通过以下几种方式实现: 1. 通过代码设置焦点:可以通过调用 View 的 requestFocus() 方法来设置焦点,例如: ``` EditText editText = findViewById(R.id.editText); editText.requestFocus(); ``` 2. 通过 XML 属性设置焦点:可以在 XML 文件使用 android:focusable 和 android:focusableInTouchMode 属性来设置 View 是否可获得焦点,例如: ``` <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:focusable="true" android:focusableInTouchMode="true" /> ``` 3. 通过监听器处理焦点:可以通过设置 View 的 OnFocusChangeListener 来监听焦点变化事件,例如: ``` editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { // 处理获取焦点事件 } else { // 处理失去焦点事件 } } }); ``` 4. 通过键盘事件处理焦点:可以在处理键盘事件时,根据当前焦点 View 的 ID 或位置,计算出下一个需要获得焦点的 View,并调用其 requestFocus() 方法来设置焦点,例如: ``` editText.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) { View nextView = v.focusSearch(View.FOCUS_DOWN); if (nextView != null) { nextView.requestFocus(); return true; } } return false; } }); ``` 以上是几种常见的焦点移动方式,可以根据自己的需求选择合适的方式来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值