使用ViewFlipper实现Switch简单的开启可关闭动画特效,Switch部分主要为自定义控件,继承的ViewFlipper。
1、主Activity文件,其中实现了对mSwitch的点击监听事件,通过判断labelState的状态来选择开启或关闭开关。
package com.chengkni.demo.viewflipper; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.Toast; public class MainActivity extends Activity { private MyViewFlipper mSwitch; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); initView(); } private void initView() { mSwitch = (MyViewFlipper) findViewById(R.id.vf_main_my_switch); mSwitch.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { if (mSwitch.labelState) { Toast.makeText(getApplicationContext(), "开关已打开", Toast.LENGTH_SHORT).show(); mSwitch.openPrevious(); } else { Toast.makeText(getApplicationContext(), "开关已关闭", Toast.LENGTH_SHORT).show(); mSwitch.openNext(); } } }); } }
2、自定义的Switch控件。继承了ViewFlipper ,覆盖了几个父类方法和自定义了几个方法。
package com.chengkni.demo.viewflipper; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.widget.ViewFlipper; public class MyViewFlipper extends ViewFlipper { private String TAG = this.getClass().getSimpleName(); public boolean labelState = false; private Context mContext; public MyViewFlipper(Context context) { super(context); mContext = context; Log.e(TAG, "MyViewFlipper(Context context)"); } public MyViewFlipper(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; Log.e(TAG, "MyViewFlipper(Context context, AttributeSet attrs)"); } /** * 说明:显示下一个标签 */ public void openNext() { setInAnimation(mContext, R.anim.open_label_in_anim); setOutAnimation(mContext, R.anim.open_label_out_anim); showNext(); labelState = true; } /** * 说明:显示下一个标签 * * @param inAnim 标签入场动画 * @param outAnim 标签出场动画 */ public void openNext(int inAnim, int outAnim) { setInAnimation(mContext, inAnim); setOutAnimation(mContext, outAnim); showNext(); labelState = true; } /** * 说明:显示上一个标签 */ public void openPrevious() { setInAnimation(mContext, R.anim.close_label_in_anim); setOutAnimation(mContext, R.anim.close_label_out_anim); showPrevious(); labelState = false; } /** * 说明:显示上一个标签 * * @param inAnim 标签入场动画 * @param outAnim 标签出场动画 */ public void openPrevious(int inAnim, int outAnim) { setInAnimation(mContext, inAnim); setOutAnimation(mContext, outAnim); showPrevious(); labelState = false; } @Override public void showNext() { super.showNext(); } @Override public void showPrevious() { super.showPrevious(); } @Override public void setInAnimation(Context context, int resourceID) { super.setInAnimation(context, resourceID); } @Override public void setOutAnimation(Context context, int resourceID) { super.setOutAnimation(context, resourceID); } }
3、Switch的动画实现使用的anim文件。文件详见完整工程包。
4、主布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <com.chengkni.demo.viewflipper.MyViewFlipper android:id="@+id/vf_main_my_switch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" > <TextView android:id="@+id/tv_main_close_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/main_close_lable" android:textSize="25sp" /> <TextView android:id="@+id/tv_main_open_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/main_open_lable" android:textSize="25sp" /> </com.chengkni.demo.viewflipper.MyViewFlipper> </RelativeLayout>
“ViewFlipper实现Switch动画特效完”整工程文件下载地址