最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android仿淘寶商品詳情頁

 更新時(shí)間:2018年10月26日 09:53:35   作者:AnalyzeSystem  
這篇文章主要為大家詳細(xì)介紹了Android仿淘寶商品詳情頁,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

看到有人在問如何實(shí)現(xiàn)淘寶商品詳情頁效果,獻(xiàn)上效果圖

大致梳理一下思路,這里不提供源碼

狀態(tài)欄透明使用開源庫StatusBarCompat,為了兼容手機(jī)4.4

dependencies {
  compile ('com.github.niorgai:StatusBarCompat:2.1.4', {
   exclude group: 'com.android.support'
  })
 }

allprojects {
  repositories {
   ...
   maven { url "https://jitpack.io" }
  }
 }

標(biāo)題欄圖標(biāo)透明度變化參考Api setAlpha()已過時(shí)

icon.setImageAlpha(0);

Banner控件為ViewPager,淘寶顯示為正方形,這里需要修改ViewPager measure函數(shù)

public class IdeaViewPager extends ViewPager {

 private Point point;

 public IdeaViewPager(Context context) {
  this(context,null);
 }

 public IdeaViewPager(Context context, AttributeSet attrs) {
  super(context, attrs);
  WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
  point = new Point();
  windowManager.getDefaultDisplay().getSize(point);
 }

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  setMeasuredDimension(point.x,point.x);
 }
}

測量View高度,獲取到高度集合綁定到ScrollView,根據(jù)ScrollView滑動(dòng)距離判斷是屬于哪一個(gè)Tab選項(xiàng)

public int getMeasureHeight(View view){
  int width = View.MeasureSpec.makeMeasureSpec(0,
    View.MeasureSpec.UNSPECIFIED);
  int height = View.MeasureSpec.makeMeasureSpec(0,
    View.MeasureSpec.UNSPECIFIED);
  view.measure(width, height);
  return view.getMeasuredHeight();
 }

重新onScrollChanged函數(shù),實(shí)現(xiàn)ViewPager滑動(dòng)速度比其他View慢

@Override
 protected void onScrollChanged(int l, int t, int oldl, int oldt) {
  super.onScrollChanged(l, t, oldl, oldt);
  if (viewPager != null && t != oldt) {
   viewPager.setTranslationY(t/2);
  }
 }

根據(jù)限定距離(Banner)計(jì)算百分比偏移量,實(shí)現(xiàn)顏色漸變、透明度漸變(淘寶商品詳情頁有二次顏色漸變)

 @Override
 protected void onScrollChanged(int l, int t, int oldl, int oldt) {
  super.onScrollChanged(l, t, oldl, oldt);

  if(viewPager!=null&&t<=point.x-headerHeight&&getOnScrollChangedColorListener()!=null){

   getOnScrollChangedColorListener().onChanged(Math.abs(t)/Float.valueOf(point.x-headerHeight));
   if(t<=(point.x-headerHeight)/2){
    getOnScrollChangedColorListener().onChangedFirstColor(t/(point.x-headerHeight)/2);
   }else{
    getOnScrollChangedColorListener().onChangedSecondColor((t-(point.x-headerHeight)/2)/(point.x-headerHeight)/2);
   }

  }

  int currentPosition = getCurrentPosition(t,arrayDistance);
  if(currentPosition!=position&&getOnSelectedIndicateChangedListener()!=null){
   getOnSelectedIndicateChangedListener().onSelectedChanged(currentPosition);
  }
  this.position = currentPosition;
 }

單一顏色漸變透明度,還原argb通道,修改a值

 ideaScrollView.setOnScrollChangedColorListener(new IdeaScrollView.OnScrollChangedColorListener() {
   @Override
   public void onChanged(float percentage) {

    int color = getAlphaColor(percentage>0.9f?1.0f:percentage);
    header.setBackgroundDrawable(new ColorDrawable(color));
    radioGroup.setBackgroundDrawable(new ColorDrawable(color));
    icon.setImageAlpha((int) ((percentage>0.9f?1.0f:percentage)*255));
    radioGroup.setAlpha((percentage>0.9f?1.0f:percentage)*255);

    setRadioButtonTextColor(percentage);

   }

   @Override
   public void onChangedFirstColor(float percentage) {

   }

   @Override
   public void onChangedSecondColor(float percentage) {

   }
  });

  ideaScrollView.setOnSelectedIndicateChangedListener(new IdeaScrollView.OnSelectedIndicateChangedListener() {
   @Override
   public void onSelectedChanged(int position) {
    isNeedScrollTo = false;
    radioGroup.check(radioGroup.getChildAt(position).getId());
    isNeedScrollTo = true;
   }
  });

 public int getAlphaColor(float f){
  return Color.argb((int) (f*255),0x09,0xc1,0xf4);
 }

Tab選項(xiàng)屬性不能太頻繁,會(huì)有顏色值閃爍情況出現(xiàn),這里需要策略

 public void setRadioButtonTextColor(float percentage){
  if(Math.abs(percentage-currentPercentage)>=0.1f){
   for(int i=0;i<radioGroup.getChildCount();i++){
    RadioButton radioButton = (RadioButton) radioGroup.getChildAt(i);
    radioButton.setTextColor(radioButton.isChecked()?getRadioCheckedAlphaColor(percentage):getRadioAlphaColor(percentage));
   }
   this.currentPercentage = percentage;
  }
 }

判斷當(dāng)前屬于哪個(gè)選項(xiàng),根據(jù)滑動(dòng)距離與傳入綁定的View高度集合來計(jì)算

private int getCurrentPosition(int t, ArrayList<Integer> arrayDistance) {

 int index = 0;
 for (int i=0;i<arrayDistance.size();i++){
  if(i==arrayDistance.size()-1){
  index = i;
  }else {
  if(t>=arrayDistance.get(i)&&t<arrayDistance.get(i+1)){
   index = i;
   break;
  }
  }
 }
 return index;
 }

切換選項(xiàng)卡以及回到頂部按鈕的具體實(shí)現(xiàn)參考scrollTo函數(shù)

private void scrollToPosition(int position){
 scrollTo(0,arrayDistance.get(position));
 }

以上代碼實(shí)現(xiàn)了上圖效果,當(dāng)然也可以使用RecyclerView AbsListView做容器。

希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

华安县| 农安县| 静海县| 麻江县| 文水县| 东丽区| 崇礼县| 沙湾县| 凤庆县| 宜宾市| 大渡口区| 芦山县| 汝阳县| 淮阳县| 襄垣县| 张家口市| 曲阜市| 宁安市| 花莲市| 景宁| 屏东市| 赤水市| 宜丰县| 马公市| 蒲江县| 临猗县| 襄城县| 景洪市| 舟山市| 临城县| 德惠市| 清流县| 贡觉县| 靖远县| 西丰县| 乐陵市| 且末县| 石泉县| 个旧市| 维西| 陈巴尔虎旗|