欢迎使用CSDN-markdown编辑器
2015-11-06 14:09
363 查看
Android ViewGroup中子控件切换
之前一直很好奇Go桌面在编辑模式中长按图标进行拖拽,拖拽的过程中其它图标如何流畅的进行切换,如果直接交换两个图标的位置的话,是一种闪烁的效果,通过查看别人的代码知道是通过重写onLayout函数,在onLayout函数中动态的调整子控件的位置,依据这个思想我写了以下demo。主Activity类:
public class MainActivity extends Activity implements OnClickListener{ private TViewGroup mTViewGroup; public static final String TAG = "xiaobian"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mTViewGroup = new TViewGroup(this); mTViewGroup.setOnClickListener(this); setContentView(mTViewGroup); } @Override public void onClick(View arg0) { // TODO Auto-generated method stub Log.i(TAG, "onClick"); mTViewGroup.go(10); } }
重写的ViewGroup:
public class TViewGroup extends ViewGroup{
private TextView mTextView1; private TextView mTextView2; private int mPosSpace = 5; private int mDestX1 = 0; private int mDestX2 = 0; private boolean mSwitchFlag = false; private boolean mDirection = false; private boolean mInitFlag = true; private boolean mIsAnimating = false; private int x1Start = 0; private int x2Start = 0; public TViewGroup(Context context) { super(context); // TODO Auto-generated constructor stub this.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); mTextView1 = new TextView(context); mTextView1.setText("===Hello World==="); mTextView1.setLayoutParams(new ViewGroup.LayoutParams(200, 200)); this.addView(mTextView1); mTextView2 = new TextView(context); mTextView2.setText("***Hello World***"); mTextView2.setLayoutParams(new ViewGroup.LayoutParams(200, 200)); this.addView(mTextView2); this.setBackgroundResource(R.drawable.ic_launcher); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub super.onMeasure(widthMeasureSpec, heightMeasureSpec); Log.i(MainActivity.TAG, "onMeasure widthMeasureSpec = " + widthMeasureSpec + " height = " + heightMeasureSpec); mTextView1.measure(200, 200); mTextView2.measure(200, 200); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { // TODO Auto-generated method stub mTextView1.measure(r - l, b - t); mTextView2.measure(r - l, b - t); Log.i(MainActivity.TAG, "onLayout left = " + l + " t = " + t + " r = " + mTextView1.getMeasuredWidth() + " b = " + mTextView1 .getMeasuredHeight()); /*mTextView1.layout(l + mPosSpace, t, l + mPosSpace + mTextView1.getMeasuredWidth(), t + mTextView1 .getMeasuredHeight()); int left2 = r - mTextView2.getMeasuredWidth(); mTextView2.layout(left2 + mPosSpace, t, left2 + mPosSpace + mTextView2.getMeasuredWidth(), t + mTextView2 .getMeasuredHeight());*/ mTextView1.layout(0, 0, mTextView1.getMeasuredWidth(), mTextView1.getMeasuredHeight()); mTextView2.layout(0, 0, mTextView2.getMeasuredWidth(), mTextView2.getMeasuredHeight()); } @Override public void draw(Canvas canvas) { // TODO Auto-generated method stub super.draw(canvas); Log.i(MainActivity.TAG, "draw"); } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); int left = mTextView1.getLeft(); int t = mTextView1.getTop(); int r = mTextView1.getRight(); int b = mTextView1.getBottom(); int left2 = this.getWidth() - mTextView2.getWidth(); if(mInitFlag) { x1Start = 0; x2Start = this.getWidth() - mTextView1.getWidth(); mInitFlag = !mInitFlag; } if(mSwitchFlag) { if(mDirection) { if(x1Start + mPosSpace < 0 || x1Start + mPosSpace > this.getWidth() - mTextView1.getWidth()) { x1Start = x1Start; x2Start = x2Start; mIsAnimating = false; }else { x1Start += mPosSpace; x2Start -= mPosSpace; mIsAnimating = true; } }else { if(x1Start - mPosSpace < 0 || x1Start - mPosSpace > this.getWidth() - mTextView1.getWidth()) { x1Start = x1Start; x2Start = x2Start; mIsAnimating = false; }else { x1Start -= mPosSpace; x2Start += mPosSpace; mIsAnimating = true; } } Log.i(MainActivity.TAG, "onDraw x1Start = " + x1Start + " direction = " + mDirection); Log.i(MainActivity.TAG, "onDraw x2Start = " + x2Start + " direction = " + mDirection); mTextView1.layout(x1Start, t, x1Start + mTextView2.getWidth(), t + mTextView2.getHeight()); mTextView2.layout(x2Start, t, x2Start + mTextView1.getWidth(), t + mTextView1.getHeight()); //this.postInvalidate(); }else { mTextView1.layout(left, t, left + mTextView1.getWidth(), t + mTextView1.getHeight()); mTextView2.layout(left2, t, left2 + mTextView2.getWidth(), t + mTextView2.getHeight()); } } public void go(int step) { if(!mIsAnimating) { mSwitchFlag = true; mDirection = !mDirection; mPosSpace = 10; Log.i(MainActivity.TAG, "go mPosSpace = " + mPosSpace); this.requestLayout(); } }
}
初始状态:
结束状态:
下载地址:http://download.csdn.net/detail/xiaoxiaobian3310903/9247413
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories