編輯:關於Android編程
這個功能的實現,需要用的
水平滑動TranslateAnimation,用於計算頁面滑動是,導航條滑動的距離,
viewpager,用法同上一篇博客一樣。
第二步,怎麼在代碼中根據viewPager來滑動上面的黃色條呢,這裡用到的是水平滑動動畫。看全部代碼:
1、TranslateAnimation:位移變化的動畫,創建該動畫時只要指定動畫開始時的位置(以X、Y坐標來表示)、結束時的位置(以X、Y坐標來表示),並指定動畫持續時間即可。
/*
* float fromXDelta 動畫開始的點離當前View X坐標上的差值
* float toXDelta 動畫結束的點離當前View X坐標上的差值
* float fromYDelta 動畫開始的點離當前View Y坐標上的差值
* float toYDelta 動畫開始的點離當前View Y坐標上的差值
* 起始點X軸坐標(數值、譬如50表示以當前View左上角坐標加50px為初始點、
* 50%表示以當前View的左上角加上當前View寬高的50%做為初始點、
* 50%p表示以當前View的左上角加上父控件寬高的50%做為初始點)
* */
import android.app.Activity; import android.graphics.BitmapFactory; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.util.DisplayMetrics; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.animation.Animation; import android.view.animation.TranslateAnimation; import android.widget.ImageView; import java.util.ArrayList; import java.util.List; public class MainActivity extends Activity { private ViewPager vp; //把定義好的三個布局進行初始化對象 private View item_view01,item_view02,item_view03; //創建一個list集合 參數為view private ListviewPager適配器代碼Mview = new ArrayList<>(); //用於引用布局好的三個itemView布局 private LayoutInflater inflater; private ViewPagerAdapter adapter; private ImageView img01; private int img_wight = 0; // 游標寬度 private int currIndex = 0;// 當前頁卡編號 private int offset = 0;// // 動畫圖片偏移量 int log = 0; int w=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /* * LayoutInflater講解 * 對於一個沒有被載入或者想要動態載入的界面,都需要使用LayoutInflater.inflate()來載入; * 對於一個已經載入的界面,就可以使用Activiyt.findViewById()方法來獲得其中的界面元素。 * 想了解更多:http://www.cnblogs.com/maliqian/p/3473800.html * */ inflater = getLayoutInflater(); setView(); } private void setView() { //初始化viewPager vp = (ViewPager)findViewById(R.id.viewp_01); item_view01 = inflater.inflate(R.layout.item01,null); item_view02 = inflater.inflate(R.layout.item02,null); item_view03 = inflater.inflate(R.layout.item03,null); img01 = (ImageView) findViewById(R.id.img01); //把三個View布局對象加載到list中,這些就是item的數據 Mview.add(item_view01); Mview.add(item_view02); Mview.add(item_view03); //初始化指示器位置 initPosition(); //把數據傳遞給適配器中,進行數據處理。 adapter = new ViewPagerAdapter(this,Mview); vp.setOnPageChangeListener(new MyPageChangeListener()); vp.setAdapter(adapter); } private void initPosition() { //很明顯是通過BitmapFactory.decodeResource()方法獲取圖片資源的寬度 img_wight = BitmapFactory.decodeResource(getResources(),R.drawable.img01).getWidth(); Log.i("Text","img_wight "+img_wight); //看上面注釋(01) DisplayMetrics disp = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(disp); w = disp.widthPixels;//獲取了分辨率的寬度 Log.i("Text","wwwwww "+w); Log.i("Text","w/Mview.size() "+w/Mview.size()); offset = ((w/Mview.size())-img_wight)/2;// 計算偏移量,自己用筆劃一下就明白了 Log.i("Text","offsetoffset "+offset); } //頁面改變監聽器 public class MyPageChangeListener implements ViewPager.OnPageChangeListener { int one = img_wight+offset*2;// 頁面一到頁面二移動量,他的大小就是屏幕的三分之一 int two = one * 2;// 頁卡1 -> 頁卡3 偏移量 @Override public void onPageSelected(int arg0) { Log.i("Text","oneoneone "+one); //創建一個移動動畫,用來實現滑動效果 Animation animation = null; switch (arg0) { case 0: //0,1,2對應第一頁,第二頁,第三頁 //這個的意思就是,你要滑動到0位置 if (currIndex == 1) { //從1滑動到0位置 animation = new TranslateAnimation(one, 0, 0, 0); } else if (currIndex == 2) { //從2滑動到0位置 animation = new TranslateAnimation(two, 0, 0, 0); } break; case 1: if (currIndex == 0) { //從0滑動到1位置 animation = new TranslateAnimation(0, one, 0, 0); } else if (currIndex == 2) { //從2滑動到1位置 animation = new TranslateAnimation(two, one, 0, 0); } break; case 2: if (currIndex == 0) { //從0滑動到2位置 animation = new TranslateAnimation(0, two, 0, 0); } else if (currIndex == 1) { //從1滑動到2位置 animation = new TranslateAnimation(one, two, 0, 0); } break; } currIndex = arg0; animation.setFillAfter(true);// True:圖片停在動畫結束位置 animation.setDuration(300);// img01.startAnimation(animation); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } } }
import android.content.Context; import android.support.v4.view.PagerAdapter; import android.view.View; import android.view.ViewGroup; import java.util.List; /** * Created by ENZ on 2016/9/29. */ public class ViewPagerAdapter extends PagerAdapter { private Context context; private Listviewdata; public ViewPagerAdapter(MainActivity mainActivity, List mview) { context = mainActivity; viewdata = mview; } //這個方法是獲取一共有多少個item @Override public int getCount() { return viewdata.size(); } //這個就這樣寫就OK ,無需管 @Override public boolean isViewFromObject(View view, Object object) { return view==object; } //這個方法用來實例化頁卡 @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(viewdata.get(position),0); return viewdata.get(position); } //刪除實例化頁卡 @Override public void destroyItem(ViewGroup container, int position, Object object) { // TODO Auto-generated method stub container.removeView(viewdata.get(position)); } }
滑動的方法上面已經說過了(x軸起點,x軸滑動的終點,y起點,y軸滑動位置的終點)
如果現在從第一頁滑動,因為一共就三個頁面。
第一頁滑動到第二頁,用到的動畫是TranslateAnimation(0,one(就是屏幕的三分之一),0,0)
從第二頁滑動到第三頁的位置第二頁就是TranslateAnimation(one,two(屏幕的三分之二位置),0,0);
我在dome中也寫了一個水平滑動的類,布局如下:
代碼如下:
import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.animation.AnimationSet; import android.view.animation.TranslateAnimation; import android.widget.ImageView; import android.widget.TextView; /** * Created by ENZ on 2016/9/30. */ public class DomeActivity extends Activity { private ImageView headimg_iv; private TextView login_tv_login; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.animation); headimg_iv = (ImageView)findViewById(R.id.login_iv); login_tv_login = (TextView)findViewById(R.id.tv_login); login_tv_login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { test(); } }); } /* * 1.Alpha:透明度改變效果 *2.Scale:縮放效果 *3.Rotate:旋轉效果 *4.Translate:移動效果 * */ private void test() { AnimationSet set = new AnimationSet(true); set.setFillAfter(true); // (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) TranslateAnimation translate = new TranslateAnimation(0,360,0,0); translate.setDuration(1000); translate.setFillAfter(true); set.addAnimation(translate); headimg_iv.startAnimation(set); } }
最後記得把清單文件中的改下
本文實例講述了Android編程ProgressBar自定義樣式之動畫模式實現方法。分享給大家供大家參考,具體如下:忘記在哪裡看到的那位仁兄寫的,就是通過用動畫效果來實現
針對Android Studio的系列文章,都是一個小問題為一篇,並沒有整理到一起,主要是方便大家根據自己的需要來查找,同時為了便於大家理解,都會直接上圖。 我這裡使用的
Android Studio原生支持使用Gradle來構建項目,使用動態語言Groovy定義項目構建的過程,避免了build.xml文件繁瑣的定義。然而使用的時候,卻有著
刷機精靈是Android手機一鍵刷機輔助工具,可以幫助玩家更快速完成刷機操作,很多用戶對刷機精靈的使用不是很了解,那麼刷機精靈應該如何操作呢,一起來和小編