效果就是仿新闻软件的分类菜单的动态移动效果,写了实现的方法,布局写的简单。
源码:
/**
* 分类的动画移动
*
* @author hongjie
*
*/
public class MoveActivity extends Activity implements OnClickListener {
private TextView fir;
private TextView sec;
private TextView thi;
private TextView text;
private int leftLength;
private int width;
private int[] location = new int[2];
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.move_activity);
// 获取添加到的Layout
RelativeLayout linear = (RelativeLayout) findViewById(R.id.move);
// 覆盖的图片view
text = new TextView(this);
text.setBackgroundResource(R.drawable.slidebar);
text.setText("第一个");
// 在Layout中加入view
linear.addView(text);
// 获取屏幕的宽度
WindowManager wm = (WindowManager) this
.getSystemService(Context.WINDOW_SERVICE);
width = wm.getDefaultDisplay().getWidth();
// 加载组件
fir = (TextView) findViewById(R.id.first);
sec = (TextView) findViewById(R.id.second);
thi = (TextView) findViewById(R.id.third);
// 添加监听器
fir.setOnClickListener(this);
sec.setOnClickListener(this);
thi.setOnClickListener(this);
}
/**
* 点击事件
*/
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 获取view的位置
v.getLocationOnScreen(location);
// 移动点击组件的x位置
MoveView(text, leftLength, location[0], 0, 0);
// 将当前位置的文本添加到view中
text.setText(((TextView) v).getText());
// 将当前的位置 作为下次移动的起点位置
leftLength = location[0];
}
/**
* 移动动画方法
*
* @param view
* @param startX
* @param stopX
* @param startY
* @param stopY
*/
public void MoveView(View view, int startX, int stopX, int startY, int stopY) {
TranslateAnimation trans = new TranslateAnimation(startX, stopX,
startY, stopY);
trans.setDuration(100);
trans.setFillAfter(true);
view.startAnimation(trans);
}
}
布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/move"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/first"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="第一个" />
<TextView
android:id="@+id/second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="第二个" />
<TextView
android:id="@+id/third"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="第三个" />
</LinearLayout>
</RelativeLayout>
效果:
需要注意的地方:
1.不要直接的设置整个布局为LinearLayout,那样设置了权重后,添加的view就不能放到点击的组件上面了,添加的组件会自动的在行布局中添加一个组件位置,不能覆盖到点击的组件。使用相对布局,也可以保证布局的扩展性。
2.// 获取添加到的Layout
RelativeLayout linear = (RelativeLayout) findViewById(R.id.move);
// 在Layout中加入view
linear.addView(text);
往指定的布局中添加view。
3.MoveView(View view, int startx, int stopx, int starty, int stopy)中的参数是相对获取的布局的参数,不是手机屏幕的参数。