您的位置:首页 > 移动开发 > Android开发

欢迎使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android