tab indicator
来源:互联网 发布:mac number 求和 编辑:程序博客网 时间:2024/05/21 06:01
<pre name="code" class="html"><LinearLayout 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" android:orientation="vertical" tools:context="com.example.tabanim.MainActivity" > <TextView android:id="@+id/textView0" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:id="@+id/linearLayout1"> <ImageView android:id="@+id/imageView" android:layout_width="360dp" android:layout_height="wrap_content" android:src="@drawable/abc_tab_selected_pressed_holo"> </ImageView> <LinearLayout android:id="@+id/linearLayout2" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/textView1" android:layout_width="120dp" android:layout_height="60dp" android:background="#ffcc00" android:text="TextView" /> <TextView android:id="@+id/textView2" android:layout_width="120dp" android:layout_height="60dp" android:background="#dd00ff" android:text="TextView" /> <TextView android:id="@+id/textView3" android:layout_width="120dp" android:layout_height="60dp" android:background="#aacc00" android:text="TextView" /> </LinearLayout> <Button android:id="@+id/Cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Cancel" /> </LinearLayout></LinearLayout>
package com.example.tabanim;import android.animation.Animator;import android.animation.ValueAnimator;import android.animation.ValueAnimator.AnimatorUpdateListener;import android.annotation.SuppressLint;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.animation.LinearInterpolator;import android.widget.Button;import android.widget.ImageView;import android.widget.ImageView.ScaleType;import android.widget.LinearLayout;import android.widget.TextView;public class MainActivity extends Activity {private ImageView image; private TextView btn1, btn2, btn3, btn4; private Button cancel;private TabIndicatorAnim mTabIndicatorAnim;private int mWidth = (int) (1080/3.0);private int mLastPos = 0; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); image = (ImageView)findViewById(R.id.imageView); LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) image .getLayoutParams(); lp.width = mWidth; image.setLayoutParams(lp); image.setScaleType(ScaleType.FIT_XY); btn1 = (TextView)findViewById(R.id.textView1); btn2 = (TextView)findViewById(R.id.textView2); btn3 = (TextView)findViewById(R.id.textView3); // btn4 = (Button)findViewById(R.id.button4); cancel = (Button)findViewById(R.id.Cancel); mTabIndicatorAnim = new TabIndicatorAnim(image, mWidth); image.setTranslationX(mLastPos*mWidth); btn1.setOnClickListener(new Button.OnClickListener(){//创建监听 public void onClick(View v) { mTabIndicatorAnim.startAnim(mLastPos, 0); mLastPos = 0; } }); btn2.setOnClickListener(new Button.OnClickListener(){//创建监听 public void onClick(View v) { mTabIndicatorAnim.startAnim(mLastPos, 1); mLastPos = 1; } }); btn3.setOnClickListener(new Button.OnClickListener(){//创建监听 public void onClick(View v) { mTabIndicatorAnim.startAnim(mLastPos, 2); mLastPos = 2; } }); cancel.setOnClickListener(new Button.OnClickListener(){//创建监听 public void onClick(View v) { mTabIndicatorAnim.cancelAnim(); float f1 = 360.0f; int f2 = mWidth; int retval = Float.compare(f1, f2); if(retval > 0) { Log.e("suosuo", "f1 is greater than f2"); } else if(retval < 0) { Log.e("suosuo", "f1 is less than f2"); } else { Log.e("suosuo", "f1 is equal to f2"); } } }); // btn4.setOnClickListener(new Button.OnClickListener(){//创建监听 // public void onClick(View v) { // mTabIndicatorAnim.startAnim(mLastPos, 3);// mLastPos = 3;// } // }); } class TabIndicatorAnim { private int mWidth; private View mView; private int mCancelLastStartPos = -1; private ValueAnimator mAnimator; private float mScaleUpProp = 130; private float mTotalProp = 480; private int mDuration = 5000;//480; private float mScaleDownValue = 1.0f; private float mScaleUpValue = 2.0f; TabIndicatorAnim(View view, int width) { mView = view; mWidth = width; } public void startAnim(int from, int to){ //cancelAnim(); if (from == to) { return; } else if (from < to) { // from left to right cancelAnim(); anim(from, to, 1, to-from); } else { // from right to left cancelAnim(); anim(from, to, 0, from-to); } } private void cancelAnim(){ if (mAnimator != null) mAnimator.cancel(); } private void anim(final int from, final int to, final int l2r, final int count) { mAnimator = ValueAnimator.ofFloat(0, mScaleUpProp, mTotalProp); mAnimator.setTarget(mView); mAnimator.setDuration(mDuration).start(); // mAnimator.setInterpolator(new LinearInterpolator()); mAnimator.addUpdateListener(new AnimatorUpdateListener() { boolean isAfterScaleUp = false; boolean isAfterLeaveGap = false; int afterScaleUpX = 0; float orginalScaleX = mView.getScaleX(); float orginalTranslationX = mView.getTranslationX(); int transXCmpRet = Float.compare(orginalTranslationX, from*mWidth); int scaleXCmpRet = Float.compare(2.0f, orginalScaleX); int test = 1; public void onAnimationUpdate(ValueAnimator animation) { Float value = (Float) animation.getAnimatedValue(); Log.e("suosuoa", "from " + from + " to " + to + " value " + value + " orginalScaleX " + orginalScaleX + " orginalTranslationX " + orginalTranslationX); if (test == 1) { } else if (test == 2) { if (l2r == 1) { if (transXCmpRet > 0) { // 1->0 cancel, 0->1 anim start if (orginalScaleX > mScaleDownValue) { Log.e("suosuoa", "ccccccc orginalScaleX" + orginalScaleX); mView.setPivotX((l2r == 1)?(mWidth):(0)); mView.setScaleX((float) (orginalScaleX-(orginalScaleX-mScaleDownValue)*(value)/mTotalProp)); //scale 2 to 1 } } else if (transXCmpRet < 0) { //0->1 cancel, 1->2 startAnim Log.e("suosuoa", "0->1 cancel, 1->2 startAnim"); if (scaleXCmpRet == 0) { // scale up done and scale down if (!isAfterScaleUp) { mView.setPivotX((l2r == 1)?(mWidth):(0)); if (mCancelLastStartPos != -1) { Log.e("mCancelLastStartPos", "mCancelLastStartPos " + mCancelLastStartPos); afterScaleUpX = (l2r == 1)?((mCancelLastStartPos+1)*mWidth):((mCancelLastStartPos-1)*mWidth); mView.setTranslationX(afterScaleUpX); } isAfterScaleUp = true; } else { mView.setScaleX((float) (mScaleUpValue-(value-mScaleUpProp)/(mTotalProp-mScaleUpProp))); //scale 2 to 1 Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX() + " value " + value); if (to-mCancelLastStartPos > 1) { mView.setTranslationX((l2r == 1)? (afterScaleUpX+(to-mCancelLastStartPos-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)): (afterScaleUpX-(to-mCancelLastStartPos-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp))); //Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX()); } } } else if (scaleXCmpRet > 0) { // start scale up and scale up doing mView.setPivotX((l2r == 1)?(0):(mWidth)); Log.e("suosuo", "aaaa value " + value); float updateScaleX = orginalScaleX + (value/mScaleUpProp)*(mScaleUpValue-orginalScaleX); if (updateScaleX > mScaleUpValue) updateScaleX = mScaleUpValue; mView.setScaleX(updateScaleX); scaleXCmpRet = Float.compare(mScaleUpValue, updateScaleX); } } else {// from begin point if (scaleXCmpRet == 0) { // scale up done and scale down if (!isAfterScaleUp) { mView.setPivotX((l2r == 1)?(mWidth):(0)); if (count == 1) { mView.setTranslationX(to*mWidth); Log.e("suosuo", "getTranslationX2 " + mView.getTranslationX()); } else { afterScaleUpX = (l2r == 1)?((from+1)*mWidth):((from-1)*mWidth); mView.setTranslationX(afterScaleUpX); } isAfterScaleUp = true; } else { mView.setScaleX((float) (mScaleUpValue-(value-mScaleUpProp)/(mTotalProp-mScaleUpProp))); //scale 2 to 1 Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX() + " value " + value); if (count > 1) { mView.setTranslationX((l2r == 1)? (afterScaleUpX+(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)): (afterScaleUpX-(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp))); //Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX()); } } } else if (scaleXCmpRet > 0) { // start scale up and scale up doing mView.setPivotX((l2r == 1)?(0):(mWidth)); Log.e("suosuo", "aaaa value " + value); float updateScaleX = orginalScaleX + (mScaleUpValue-orginalScaleX)*(value)/mTotalProp; if (updateScaleX > mScaleUpValue) updateScaleX = mScaleUpValue; mView.setScaleX(updateScaleX); scaleXCmpRet = Float.compare(mScaleUpValue, updateScaleX); } } } else { // right to left if (transXCmpRet > 0) { //2->1 cancel, 1->0 startAnim Log.e("suosuoa", "2->1 cancel, 1->0 startAnim"); if (scaleXCmpRet == 0) { // scale up done and scale down if (!isAfterScaleUp) { mView.setPivotX((l2r == 1)?(mWidth):(0)); if (mCancelLastStartPos != -1) { Log.e("mCancelLastStartPos", "mCancelLastStartPos " + mCancelLastStartPos); afterScaleUpX = (l2r == 1)?((mCancelLastStartPos+1)*mWidth):((mCancelLastStartPos-1)*mWidth); mView.setTranslationX(afterScaleUpX); } isAfterScaleUp = true; } else { mView.setScaleX((float) (mScaleUpValue-(value-mScaleUpProp)/(mTotalProp-mScaleUpProp))); //scale 2 to 1 Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX() + " value " + value); int count = (l2r == 1)?(to-mCancelLastStartPos):(mCancelLastStartPos - to); if (count > 1) { mView.setTranslationX((l2r == 1)? (afterScaleUpX+(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)): (afterScaleUpX-(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp))); //Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX()); } } } else if (scaleXCmpRet > 0) { // start scale up and scale up doing mView.setPivotX((l2r == 1)?(0):(mWidth)); Log.e("suosuo", "aaaa value " + value); float updateScaleX = orginalScaleX + (value/mScaleUpProp)*(mScaleUpValue-orginalScaleX); if (updateScaleX > mScaleUpValue) updateScaleX = mScaleUpValue; mView.setScaleX(updateScaleX); scaleXCmpRet = Float.compare(mScaleUpValue, updateScaleX); } } else if (transXCmpRet < 0) { if (to == mCancelLastStartPos) { // 0->1 cancel, 1->0 anim start if (orginalScaleX > mScaleDownValue) { Log.e("suosuoa", "ccccccc orginalScaleX" + orginalScaleX); mView.setPivotX((l2r == 1)?(mWidth):(0)); mView.setScaleX((float) (orginalScaleX-(orginalScaleX-mScaleDownValue)*(value)/mTotalProp)); //scale 2 to 1 } } else if (to > mCancelLastStartPos) { // 0->2 cancel, 2->1 anim start } } else {// from begin point if (scaleXCmpRet == 0) { // scale up done and scale down if (!isAfterScaleUp) { mView.setPivotX((l2r == 1)?(mWidth):(0)); if (count == 1) { mView.setTranslationX(to*mWidth); Log.e("suosuo", "getTranslationX2 " + mView.getTranslationX()); } else { afterScaleUpX = (l2r == 1)?((from+1)*mWidth):((from-1)*mWidth); mView.setTranslationX(afterScaleUpX); } isAfterScaleUp = true; } else { mView.setScaleX((float) (2-(value-mScaleUpProp)/(mTotalProp-mScaleUpProp))); //scale 2 to 1 Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX() + " value " + value); if (count > 1) { mView.setTranslationX((l2r == 1)? (afterScaleUpX+(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)): (afterScaleUpX-(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp))); //Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX()); } } } else if (scaleXCmpRet > 0) { // start scale up and scale up doing mView.setPivotX((l2r == 1)?(0):(mWidth)); Log.e("suosuo", "aaaa value " + value); float updateScaleX = orginalScaleX + (mScaleUpValue-orginalScaleX)*(value)/mTotalProp; if (updateScaleX > 2.0f) updateScaleX = 2.0f; mView.setScaleX(updateScaleX); scaleXCmpRet = Float.compare(2.0f, updateScaleX); } } } } else { if (value < mScaleUpProp){ mView.setPivotX((l2r == 1)?(0):(mWidth)); mView.setScaleX((float) (1+value/mScaleUpProp)); // scale 1 to 2 //Log.e("suosuo", "getTranslationX1 " + mView.getTranslationX()); } else if (value < mTotalProp) {//-50){ if (!isAfterScaleUp) { mView.setPivotX((l2r == 1)?(mWidth):(0)); if (count == 1) { mView.setTranslationX(to*mWidth); //Log.e("suosuo", "getTranslationX2 " + mView.getTranslationX()); } else { afterScaleUpX = (l2r == 1)?((from+1)*mWidth):((from-1)*mWidth); mView.setTranslationX(afterScaleUpX); } isAfterScaleUp = true; } else { mView.setScaleX((float) (2-(value-mScaleUpProp)/(mTotalProp-mScaleUpProp))); //scale 2 to 1 if (count > 1) { mView.setTranslationX((l2r == 1)? (afterScaleUpX+(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)): (afterScaleUpX-(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp))); //Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX()); } } } // else if (value < mTotalProp-20){// if (!isAfterLeaveGap) {// mView.setPivotX((l2r == 1)?(mWidth):(0));// if (count == 1) {// mView.setTranslationX(to*mWidth+40);// Log.e("suosuo", "getTranslationX2 " + mView.getTranslationX());// } else {// afterScaleUpX = (l2r == 1)?((from+1)*mWidth):((from-1)*mWidth);// mView.setTranslationX(afterScaleUpX); // }// isAfterLeaveGap = true;// } else {// mView.setScaleX((float) (2-(value-mScaleUpProp)/(mTotalProp-mScaleUpProp))); //scale 2 to 1// if (count > 1) { // mView.setTranslationX((l2r == 1)?// (afterScaleUpX+(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)):// (afterScaleUpX-(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)));// Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX());// }// }// } else {// if (!isAfterScaleUp) {// mView.setPivotX((l2r == 1)?(mWidth):(0));// if (count == 1) {// mView.setTranslationX(to*mWidth);// Log.e("suosuo", "getTranslationX2 " + mView.getTranslationX());// } else {// afterScaleUpX = (l2r == 1)?((from+1)*mWidth):((from-1)*mWidth);// mView.setTranslationX(afterScaleUpX); // }// isAfterScaleUp = true;// } else {// mView.setScaleX((float) (2-(value-mScaleUpProp)/(mTotalProp-mScaleUpProp))); //scale 2 to 1// if (count > 1) { // mView.setTranslationX((l2r == 1)?// (afterScaleUpX+(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)):// (afterScaleUpX-(count-1)*mWidth*(value-mScaleUpProp)/(mTotalProp-mScaleUpProp)));// Log.e("suosuo", "getTranslationX3 " + mView.getTranslationX());// }// }// } } } }); mAnimator.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationCancel(Animator arg0) {// TODO Auto-generated method stubLog.e("suosuo", "onAnimationCancel");mCancelLastStartPos = from;}@Overridepublic void onAnimationEnd(Animator arg0) {// TODO Auto-generated method stub// mView.setScaleX(1); // mView.setTranslationX(to*mWidth);}@Overridepublic void onAnimationRepeat(Animator arg0) {// TODO Auto-generated method stub}@Overridepublic void onAnimationStart(Animator arg0) {// TODO Auto-generated method stub} }); } }}
</pre><pre name="code" class="java">
0 0
- tab indicator
- 自定义 Tab Indicator
- 如何 TabHostFragment自定义 tab键(indicator)
- android上FragmentTabHost实现自定义Tab Indicator
- android viewpager tab indicator炫酷的Tab动画效果
- Indicator
- you must specify a way to create the tab indicator.
- Caused by: java.lang.IllegalArgumentException: you must specify a way to create the tab indicator.
- 打造史上最容易使用的Tab指示符——Indicator
- 打造史上最容易使用的Tab指示符——Indicator
- ViewPager Indicator的tab数据来自网络出现找不到viewPager的错误
- 自我总结一下实现Indicator,ViewPager与Fragment实现tab导航
- 嵌套 Tab 时部分 Fragment 不显示及指示器 Indicator 卡顿问题
- Finance Indicator
- Indicator Variables
- 自定义Indicator
- ViewPager+Indicator(如何写indicator)
- 图片仿TabLayout Indicator , 自定义Indicator
- 收藏博客
- CodeForces Gym 100971J 感觉题意有问题
- 代码中设置光标显示在EditText文本末尾
- 弦图的PERFECT ELIMINATION点排列
- 监听EditText输入状态,根据是否有输入内容显示ImageButton(清空按钮)
- tab indicator
- Android权威编程指南学习笔记1
- XMLHTTPRequest使用【学习笔记】
- 自定义Activity标题栏
- 京城游戏人-Day3:对摄像机/屏幕尺寸关系的理解(1)
- JavaEE学习笔记之SSH—Spring(3)
- 京城游戏人-Day4:Prefab 预制件用法(1)
- boost::asio 的daytime客户端和服务器实例
- C语言运算符优先级