利用Radiogroup Radiobutton 实现滑动效果菜单
2013-03-27 09:53
567 查看
第一次在满世界大侠的地方撰写博客,所以不免紧张,怕自己写出让人消掉大牙的文章。本着学习的态度,最后我还是决定把自己的学习感想记录下来。
首先我要感谢一个哥们,大部分的内容都是他的杰作,我只是稍作修改,我看到的地方时http://www.myexception.cn/mobile/418248.html,大家可以看看原创的代码。
效果图:
这里是“1111”,“2222”,“3333”是三个Radiobutton,当前如果是“1111”,点击“2222”的时候,背景的蓝色背景框会从左移动到“2222”这个地方。这里主要是重写了Radiogroup,代码如下,在此感谢原作者:
public class NewsRadioGroup extends RadioGroup implements
OnCheckedChangeListener {
private final Transformation mTransformation = new Transformation();
private Animation mAnimation;
private OnCheckedChangeListener mOnCheckedChangeListener;
private int mLastCheckedId = -1;
private Drawable mDummy;
private Drawable mDrawableNormal, mDrawableChecked;
private boolean mAminDoing = false;
public NewsRadioGroup(Context context) {
super(context);
init();
}
public NewsRadioGroup(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
super.setOnCheckedChangeListener(this);
mLastCheckedId = super.getCheckedRadioButtonId();
mDummy = getResources().getDrawable(R.drawable.rb_checked);
mDrawableNormal = getResources().getDrawable(
android.R.color.transparent);
}
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (mLastCheckedId != -1) {
doAmin(checkedId);
} else {
mLastCheckedId = checkedId;
}
if (mOnCheckedChangeListener != null) {
mOnCheckedChangeListener.onCheckedChanged(group, checkedId);
}
}
private void doAmin(int checkedId) {
RadioButton rbCurChecked = (RadioButton) super.findViewById(checkedId), rbLastChecked = (RadioButton) super
.findViewById(mLastCheckedId);
if (rbCurChecked == null || rbLastChecked == null) {
mLastCheckedId = checkedId;
return;
}
int X1 = rbLastChecked.getLeft(), X2 = rbCurChecked.getLeft();
if (X1 <= 0 && X2 <= 0) {
mLastCheckedId = checkedId;
return;
}
if (mDrawableChecked == null) {
mDrawableChecked = rbCurChecked.getBackground();
mDummy.setBounds(0, 0, rbCurChecked.getWidth(),
rbCurChecked.getHeight());
}
rbCurChecked.setBackgroundDrawable(mDrawableNormal);
// rbCurChecked.setBackgroundResource(R.drawable.rb_checked);
if (mAminDoing && mAnimation != null) {
mAnimation.reset();
}
mAnimation = new TranslateAnimation(X1, X2, rbCurChecked.getTop(),
rbCurChecked.getTop());
mAnimation.setDuration(500);
mAnimation.initialize(0, 0, 0, 0);
mAminDoing = true;
mAnimation.startNow();
invalidate();
}
@Override
public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
mOnCheckedChangeListener = listener;
}
protected void onDraw(Canvas canvas) {
if (mAnimation == null || !mAminDoing) {
return;
}
if (!mAnimation.hasEnded()) {
int sc = canvas.save();
mAnimation.getTransformation(
AnimationUtils.currentAnimationTimeMillis(),
mTransformation);
canvas.concat(mTransformation.getMatrix());
mDummy.draw(canvas);
canvas.restoreToCount(sc);
// ((RadioButton)findViewById(getCheckedRadioButtonId())).setBackgroundResource(R.color.transparent);
invalidate();
// setReallyCheck();
} else {
mAminDoing = false;
setReallyCheck();
// ((RadioButton)findViewById(getCheckedRadioButtonId())).setBackgroundResource(R.drawable.sl_tab);
}
}
private void setReallyCheck() {
if (mLastCheckedId != -1) {
super.findViewById(mLastCheckedId).setBackgroundDrawable(
mDrawableNormal);
}
mLastCheckedId = super.getCheckedRadioButtonId();
if (mLastCheckedId != -1) {
super.findViewById(mLastCheckedId).setBackgroundDrawable(
mDrawableChecked);
}
}
}// end class NesRadioGroup
这里初始化init()方法中,第一步获得三个变量mLastCheckedId,mDummy,mDrawableNormal,分别是当前选中id和两个Drawable,这里的RB_checked是用9pach做的图片,这里最重要的是三点。第一点,在onCheckedChanged中提前捕捉事件,然后启动动画效果,产生滑动,在动画结束后在运行自己的onCheckedChanged方法,这里文字的颜色就是动画之后处理的。第二点在doAmin中设置动画。第三点使用setReallyCheck()方法。
资源文件:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/topbar_select" android:state_enabled="true" android:state_focused="true" android:state_pressed="false"/>
<!-- <item android:drawable="@drawable/topbar_select" android:state_enabled="true" android:state_pressed="true"/> -->
<item android:drawable="@drawable/topbar_select" android:state_checked="true" android:state_enabled="true"/>
<item android:drawable="@drawable/transparent"/>
</selector>
这里是一个selector,每一个Radiobutton做以它作为背景,看下我注释的那行,如果不注释,会怎么样,大家可以试试。这里的topbar_select,就是前边的rb_checked图片。
以下是layout资源文件:
<com.app.view.NewsRadioGroup
android:id="@+id/rg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="@drawable/sl_n"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="visible" >
<RadioButton
android:id="@+id/rb1"
style="@style/sl_style"
android:checked="true" />
<RadioButton
android:id="@+id/rb2"
style="@style/sl_style" />
<RadioButton
android:id="@+id/rb3"
style="@style/sl_style" />
</com.app.view.NewsRadioGroup>
大家可以稍微改一改,例如滑动过程中的背景具有一定的透明效果等等。
首先我要感谢一个哥们,大部分的内容都是他的杰作,我只是稍作修改,我看到的地方时http://www.myexception.cn/mobile/418248.html,大家可以看看原创的代码。
效果图:
这里是“1111”,“2222”,“3333”是三个Radiobutton,当前如果是“1111”,点击“2222”的时候,背景的蓝色背景框会从左移动到“2222”这个地方。这里主要是重写了Radiogroup,代码如下,在此感谢原作者:
public class NewsRadioGroup extends RadioGroup implements
OnCheckedChangeListener {
private final Transformation mTransformation = new Transformation();
private Animation mAnimation;
private OnCheckedChangeListener mOnCheckedChangeListener;
private int mLastCheckedId = -1;
private Drawable mDummy;
private Drawable mDrawableNormal, mDrawableChecked;
private boolean mAminDoing = false;
public NewsRadioGroup(Context context) {
super(context);
init();
}
public NewsRadioGroup(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
super.setOnCheckedChangeListener(this);
mLastCheckedId = super.getCheckedRadioButtonId();
mDummy = getResources().getDrawable(R.drawable.rb_checked);
mDrawableNormal = getResources().getDrawable(
android.R.color.transparent);
}
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (mLastCheckedId != -1) {
doAmin(checkedId);
} else {
mLastCheckedId = checkedId;
}
if (mOnCheckedChangeListener != null) {
mOnCheckedChangeListener.onCheckedChanged(group, checkedId);
}
}
private void doAmin(int checkedId) {
RadioButton rbCurChecked = (RadioButton) super.findViewById(checkedId), rbLastChecked = (RadioButton) super
.findViewById(mLastCheckedId);
if (rbCurChecked == null || rbLastChecked == null) {
mLastCheckedId = checkedId;
return;
}
int X1 = rbLastChecked.getLeft(), X2 = rbCurChecked.getLeft();
if (X1 <= 0 && X2 <= 0) {
mLastCheckedId = checkedId;
return;
}
if (mDrawableChecked == null) {
mDrawableChecked = rbCurChecked.getBackground();
mDummy.setBounds(0, 0, rbCurChecked.getWidth(),
rbCurChecked.getHeight());
}
rbCurChecked.setBackgroundDrawable(mDrawableNormal);
// rbCurChecked.setBackgroundResource(R.drawable.rb_checked);
if (mAminDoing && mAnimation != null) {
mAnimation.reset();
}
mAnimation = new TranslateAnimation(X1, X2, rbCurChecked.getTop(),
rbCurChecked.getTop());
mAnimation.setDuration(500);
mAnimation.initialize(0, 0, 0, 0);
mAminDoing = true;
mAnimation.startNow();
invalidate();
}
@Override
public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
mOnCheckedChangeListener = listener;
}
protected void onDraw(Canvas canvas) {
if (mAnimation == null || !mAminDoing) {
return;
}
if (!mAnimation.hasEnded()) {
int sc = canvas.save();
mAnimation.getTransformation(
AnimationUtils.currentAnimationTimeMillis(),
mTransformation);
canvas.concat(mTransformation.getMatrix());
mDummy.draw(canvas);
canvas.restoreToCount(sc);
// ((RadioButton)findViewById(getCheckedRadioButtonId())).setBackgroundResource(R.color.transparent);
invalidate();
// setReallyCheck();
} else {
mAminDoing = false;
setReallyCheck();
// ((RadioButton)findViewById(getCheckedRadioButtonId())).setBackgroundResource(R.drawable.sl_tab);
}
}
private void setReallyCheck() {
if (mLastCheckedId != -1) {
super.findViewById(mLastCheckedId).setBackgroundDrawable(
mDrawableNormal);
}
mLastCheckedId = super.getCheckedRadioButtonId();
if (mLastCheckedId != -1) {
super.findViewById(mLastCheckedId).setBackgroundDrawable(
mDrawableChecked);
}
}
}// end class NesRadioGroup
这里初始化init()方法中,第一步获得三个变量mLastCheckedId,mDummy,mDrawableNormal,分别是当前选中id和两个Drawable,这里的RB_checked是用9pach做的图片,这里最重要的是三点。第一点,在onCheckedChanged中提前捕捉事件,然后启动动画效果,产生滑动,在动画结束后在运行自己的onCheckedChanged方法,这里文字的颜色就是动画之后处理的。第二点在doAmin中设置动画。第三点使用setReallyCheck()方法。
资源文件:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/topbar_select" android:state_enabled="true" android:state_focused="true" android:state_pressed="false"/>
<!-- <item android:drawable="@drawable/topbar_select" android:state_enabled="true" android:state_pressed="true"/> -->
<item android:drawable="@drawable/topbar_select" android:state_checked="true" android:state_enabled="true"/>
<item android:drawable="@drawable/transparent"/>
</selector>
这里是一个selector,每一个Radiobutton做以它作为背景,看下我注释的那行,如果不注释,会怎么样,大家可以试试。这里的topbar_select,就是前边的rb_checked图片。
以下是layout资源文件:
<com.app.view.NewsRadioGroup
android:id="@+id/rg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="@drawable/sl_n"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="visible" >
<RadioButton
android:id="@+id/rb1"
style="@style/sl_style"
android:checked="true" />
<RadioButton
android:id="@+id/rb2"
style="@style/sl_style" />
<RadioButton
android:id="@+id/rb3"
style="@style/sl_style" />
</com.app.view.NewsRadioGroup>
大家可以稍微改一改,例如滑动过程中的背景具有一定的透明效果等等。
相关文章推荐
- tabHost研究二——利用Radiobutton嵌套在RadioGroup实现TabHost效果
- Android下利用RadioGroup和RadioButton实现Tabbar的效果
- 利用RadioGroup和RadioButton实现单选且选中的效果自定图片
- Android中利用DrawerLayout+NavigationView实现滑动菜单效果
- 使用RadioGroup+ViewPager+Fragment实现带滑动的页卡效果TabHost时遇到的问题
- 如何使用RadioGroup和RadioButton实现FragmentTabHost导航效果?
- Android下利用Fragment+RadioGroup和TabHost实现底部选项卡的效果
- Android控件笔记——使用RadioGroup和RadioButton实现单选效果
- RadioGroup和RadioButton实现选项卡效果,selector,
- 通过自定义ViewGroup来实现侧滑菜单效果,解决滑动冲突
- Android利用滑动菜单框架实现滑动菜单效果
- Android 使用RadioGroup和RadioButton实现单选效果
- 使用RadioGroup与RadioButton实现单选效果
- Android 自定义View 之利用ViewPager 实现画廊效果(滑动放大缩小)
- 利用swiper.js 实现 html5 模仿手指滑动切屏效果
- 利用easytouch插件实现手势滑动的效果
- Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑实现
- Android-RadioGroup+ScrollView 实现联动标签效果
- Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑实现
- 利用ObjectAnimator实现侧滑菜单的效果