欢迎使用CSDN-markdown编辑器

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值