Android 自定义控件 轻松实现360软件详情页(2)

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class TabFragment extends Fragment
{
 public static final String TITLE = "title";
 private String mTitle = "Defaut Value";
 private TextView mTextView;

@Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  if (getArguments() != null)
  {
   mTitle = getArguments().getString(TITLE);
  }
 }

@Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
   Bundle savedInstanceState)
 {
  View view = inflater.inflate(R.layout.fragment_tab, container, false);
  mTextView = (TextView) view.findViewById(R.id.id_info);
  mTextView.setText(mTitle);
  return view;

}

public static TabFragment newInstance(String title)
 {
  TabFragment tabFragment = new TabFragment();
  Bundle bundle = new Bundle();
  bundle.putString(TITLE, title);
  tabFragment.setArguments(bundle);
  return tabFragment;
 }

}

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@id/id_stickynavlayout_innerscrollview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="none" >

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#eee"
        android:orientation="vertical"
        android:padding="5dp" >

<TextView
            android:id="@+id/id_info"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="#ffffffff"
            android:gravity="center" >
        </TextView>
 //省略了无数控件
    </LinearLayout>

</ScrollView>

没撒说的 ,let's go 。 

3、StickyNavLayout源码剖析 1、构造

public class StickyNavLayout extends LinearLayout
{

private View mTop;
 private View mNav;
 private ViewPager mViewPager;
 
 private int mTopViewHeight;
 private ScrollView mInnerScrollView;
 private boolean isTopHidden = false;

private OverScroller mScroller;
 private VelocityTracker mVelocityTracker;
 private int mTouchSlop;
 private int mMaximumVelocity, mMinimumVelocity;
 
 private float mLastY;
 private boolean mDragging;
 
 

public StickyNavLayout(Context context, AttributeSet attrs)
 {
  super(context, attrs);
  setOrientation(LinearLayout.VERTICAL);

mScroller = new OverScroller(context);
  mVelocityTracker = VelocityTracker.obtain();
  mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
  mMaximumVelocity = ViewConfiguration.get(context)
    .getScaledMaximumFlingVelocity();
  mMinimumVelocity = ViewConfiguration.get(context)
    .getScaledMinimumFlingVelocity();

}

@Override
 protected void onFinishInflate()
 {
  super.onFinishInflate();
  mTop = findViewById(R.id.id_stickynavlayout_topview);
  mNav = findViewById(R.id.id_stickynavlayout_indicator);
  View view = findViewById(R.id.id_stickynavlayout_viewpager);
  if (!(view instanceof ViewPager))
  {
   throw new RuntimeException(
     "id_stickynavlayout_viewpager show used by ViewPager !");
  }
  mViewPager = (ViewPager) view;
 }

ok,首先看下成员变量,和我们的变量的初始化,mTop、mNav、mViewPager代表我们布局的三大块了,初始化在onFinishInflate中完成,可以看到直接通过我们的id资源读取就ok。接下来还有些mScroller、mVelocityTracker、mTouchSlop、mMaximumVelocity、mMinimumVelocity、mLastY、mDragging,不用说大家都能想到这是和移动相关的,OverScroller是个辅助类,用于自定移动时帮我们处理掉数学的计算部分。mVelocityTracker相关几个变量,当然是计算什么时候需要自动移动;mTouchSlop帮我区别用户是点击还是拖拽。android中封装了很多常量在ViewConfiguration中,大家有兴趣可以了解他,之所以使用这些常量不仅仅是说,省的我们自己去定义,而是为了和系统的行为保持一致。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/3ad01d53e22f3c56cd5518aaee927350.html