Androidカスタムコンポーネント(一)


Androidカスタムコンポーネント(一)
オリジナルコンポーネントでは、上書きや組み合わせなどを避けて、自分のコンポーネントを定義することができ、後で多重化するのに便利です.たとえば、前のプロジェクトで何度もファイルブラウザコンポーネントが表示されました.
う~ん、どうまとめたらいいのかな?
 
一、概説
カスタムコンポーネントは、このように分けることができるでしょう.一、ViewまたはSurfaceView上の自己描画;二、View Groupレイアウトサブクラス統合;三、はっきりしないよ~、いい点数もないみたい=.
 
本文の工事は、個人的に主に属性資源の使用だと感じていますか?工事の主な例は以下の通りである.
名前
効果
ツールバーの
ロードダイナミック...の効果コンポーネント
loading...のダイナミック効果
次の4つのプロパティが定義されています.
1)loadImage:loadワードピクチャ、referenceタイプ
2)pointImage:小点画像、referenceタイプ
3)pointCount:小点数、integerタイプ
4)msecRate:ミリ秒レベル変化速度、integerタイプ
Titleバックグラウンドシフトのエフェクトコンポーネント
集合ビューレイアウト、タイトルバーを形成します.タイトル項目の下の背景移動の小さな効果を実現しました.
次のプロパティが定義されています.
1)titleLayout:タイトルバーレイアウト
2)bgImage:item背景画像
3)bgLeftMargin:バックグラウンド初期左ピッチ
4)animTime:アニメーション時間の移動
ViewPagerバインドタイトルの効果コンポーネント
ViewPagerはタイトルバーをバインドし、タイトル項目の下の背景移動の小さな効果を実現します.
効果の特徴は次のとおりです.
1)背景はViewPagerのスクロールに従って同期してタイトル間でスクロールする
2)タイトルをクリックすると、ViewPagerプログラムがスクロール&バックグラウンド同期を制御
属性の定義は次のとおりです.
1)tLayout:タイトルバーレイアウト
2)bImage:item背景画像
3)bMargin:背景初期左ピッチ
ListView引き出しの効果コンポーネントを追加
ListViewは引き出しの効果コンポーネントを追加します.引き出しが開いているインターフェースは1つしか使いませんでした.
1)listView:リストビューid,referenceタイプ
2)drawerContent:引き出しコンテンツビューid,referenceタイプ
3)drawerClose:引き出し内容のクローズボタンid,referenceタイプ
より多くのタイトルを非表示にできるコンポーネントをカスタマイズ
集合ビューレイアウト、タイトルバーを形成します.タイトル数の制限を超えると、より多くの効果が自動的に表示されます.
初期化には、次の手順に従います.
1)表示数の制限を設定します.デフォルトは6です.
2)タイトルの内容をバインドします.String[]の場合、直接TextViewで==が表示されます.
3)より多くの操作をバインドするビューid.自分でロードし、クリックイベントを設定します.
4)より多く表示されるビューをバインドします.既存のViewGroupである必要があります.制限を超えたタイトルコンテンツが自動的にロードされます(TextView).詳細については、表示または非表示を制御します.
また、コンテンツをリフレッシュする方法を提供し、一、タイトルバーのコンテンツの再ロード;二、より多くの表示内容の再ロード.
ライブダイナミックデータ線の描画
Viewで描画したリアルタイムデータ表示コンポーネントを利用しますか?
この文書を書いた時に入ってきたので、めちゃくちゃになったような気がします.
2点ズームは正しくないようですね?2つのタッチポイントが合っていないはずなので、1つの指がトリガーした2つのポイントが得られたので、一気に拡大しました.(推測ですが、とにかく修理はしません^^)
 
以下では「ViewPager拡張コンポーネント」を例にとりますが、ついでにViewPagerコンポーネントを見ることができます^^.
 
二、手順
属性リソースを使用して、レイアウトを統合してカスタムコンポーネントを構築するには~
 
1
)attrs.xml
コンポーネントに必要なプロパティを定義します.使わないと、クラスがカスタムコンポーネントに相当し、これらのものと結びつかないことになります.「より多くのタイトルを非表示にできるコンポーネントをカスタマイズ」は、属性も定義されていません==です.
 
ViewPager拡張コンポーネント定義の内容:
 
   
   
   
   
  1.  
  2. <declare-styleable name="TitleViewPager"> 
  3.     <attr format="reference" name="tLayout" /> 
  4.     <attr format="reference" name="bImage" /> 
  5.     <attr format="integer" name="bMargin" /> 
  6. declare-styleable> 
formatタイプ、「Androidのattrカスタムプロパティの詳細」を参照してください.
 
2
)item.xml
xmlのresourcesラベル内であれば、単独で出すのがベストです.ビューに使用するidを以下のように定義.setId(int id)は、主に相対レイアウト時に、あるidに対するViewなどに用いられる.
 
ViewPager拡張コンポーネント定義の内容:
 
   
   
   
   
  1. <item name="containerLayout" type="id"/> 
 
3
)コンポーネントの作成
クラスで属性リソースを参照します.ViewPagerの使用説明を見てみましょう.OnPageChangeListenerインタフェースメソッドとPagerAdapterアダプタ内のメソッドのコメントです.
 
   
   
   
   
  1. public class TitleViewPager extends RelativeLayout implements 
  2.         OnPageChangeListener, View.OnClickListener { 
  3.  
  4.     private Context mContext; //   
  5.     private LayoutInflater mInflater; //   
  6.  
  7.     private int titleLayoutId; //  id 
  8.     private int bgImageResId; // item id 
  9.     private int bgLeftMargin; //   
  10.  
  11.     private View titleLayout; //   
  12.     private ImageView mBgImage; // item  
  13.     private ArrayList mItemViews; //   
  14.  
  15.     private ViewPager mViewPager; // ViewPager  
  16.     private ArrayList mPageViews; //   
  17.  
  18.     private int prevOffset = -1//  , int  
  19.     private int currentIndex; //   
  20.     private int previousIndex; //   
  21.     private boolean isTitleClicked; //   
  22.  
  23.     private OnPageChangeListener mOnPageChangeListener; //   
  24.  
  25.     // private final int REFRESH_RATE = 20; //  20msec 
  26.     // private Scroller mScroller; //   
  27.     // private static final Interpolator sInterpolator = new Interpolator() { 
  28.     // public float getInterpolation(float t) { 
  29.     // t -= 1.0f; 
  30.     // return t * t * t + 1.0f; 
  31.     // } 
  32.     // }; 
  33.  
  34.     public TitleViewPager(Context context, AttributeSet attrs) { 
  35.         super(context, attrs); 
  36.  
  37.         mContext = context; 
  38.         mInflater = (LayoutInflater) context 
  39.                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
  40.  
  41.         //  TypedArray  
  42.         TypedArray typedArray = context.obtainStyledAttributes(attrs, 
  43.                 R.styleable.TitleViewPager); 
  44.         //  id, 0 
  45.         titleLayoutId = typedArray.getResourceId( 
  46.                 R.styleable.TitleViewPager_tLayout, 0); 
  47.         //  item id, 0 
  48.         bgImageResId = typedArray.getResourceId( 
  49.                 R.styleable.TitleViewPager_bImage, 0); 
  50.         //  , 0 
  51.         bgLeftMargin = typedArray.getInt(R.styleable.TitleViewPager_bMargin, 0); 
  52.  
  53.         initLayout(); //  &ViewPager 
  54.  
  55.         mItemViews = new ArrayList(); 
  56.         mPageViews = new ArrayList(); 
  57.     } 
  58.  
  59.     //  &ViewPager 
  60.     private void initLayout() { 
  61.         RelativeLayout containerLayout = new RelativeLayout(mContext); //   
  62.         containerLayout.setId(R.id.containerLayout); //   
  63.         LayoutParams containerParams = new LayoutParams( 
  64.                 LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); //  WRAP_CONTENT, WRAP_CONTENT 
  65.         containerParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, 
  66.                 RelativeLayout.TRUE); //   
  67.         containerParams.addRule(RelativeLayout.CENTER_HORIZONTAL, 
  68.                 RelativeLayout.TRUE); //   
  69.         addView(containerLayout, containerParams); //   
  70.         if (0 != bgImageResId) { 
  71.             mBgImage = new ImageView(mContext); //  item  
  72.             mBgImage.setImageResource(bgImageResId); //  item  
  73.             LayoutParams p_w_picpathParams = new LayoutParams( 
  74.                     LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); //  WRAP_CONTENT, WRAP_CONTENT 
  75.             p_w_picpathParams.addRule(RelativeLayout.CENTER_VERTICAL, 
  76.                     RelativeLayout.TRUE); //   
  77.             p_w_picpathParams.leftMargin = bgLeftMargin; //   
  78.             containerLayout.addView(mBgImage, p_w_picpathParams); //  item  
  79.         } 
  80.         if (titleLayoutId != 0) { 
  81.             titleLayout = mInflater.inflate(titleLayoutId, thisfalse); //   
  82.             LayoutParams titleParams = new LayoutParams( 
  83.                     LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); //  WRAP_CONTENT, WRAP_CONTENT 
  84.             titleParams.addRule(RelativeLayout.CENTER_HORIZONTAL, 
  85.                     RelativeLayout.TRUE); //   
  86.             titleParams.addRule(RelativeLayout.CENTER_VERTICAL, 
  87.                     RelativeLayout.TRUE); //   
  88.             containerLayout.addView(titleLayout, titleParams); //   
  89.         } 
  90.         mViewPager = new ViewPager(mContext); //  ViewPager 
  91.         mViewPager.setAdapter(new MPagerAdapter()); //  ViewPager  
  92.         mViewPager.setOnPageChangeListener(this); //   
  93.         LayoutParams viewPagerParams = new LayoutParams( 
  94.                 LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); //  FILL_PARENT, FILL_PARENT 
  95.         viewPagerParams.addRule(RelativeLayout.BELOW, containerLayout.getId()); //   
  96.         viewPagerParams.addRule(RelativeLayout.CENTER_HORIZONTAL, 
  97.                 RelativeLayout.TRUE); //   
  98.         addView(mViewPager, viewPagerParams); //  ViewPager 
  99.     } 
  100.  
  101.     //   
  102.     public void addBindedPage(int pageViewId, int titleItemId) { 
  103.         mPageViews.add(mInflater.inflate(pageViewId, thisfalse)); 
  104.         View item = titleLayout.findViewById(titleItemId); 
  105.         item.setOnClickListener(this); 
  106.         mItemViews.add(item); 
  107.     } 
  108.  
  109.     //   
  110.     public int getCount() { 
  111.         return mPageViews.size(); 
  112.     } 
  113.  
  114.     //  ( UI , onWindowFocusChanged()) 
  115.     public void setPage(int index) { 
  116.         setImagePosition(index); //   
  117.         mViewPager.setCurrentItem(index, false); //  ViewPager  
  118.     } 
  119.  
  120.     //   
  121.     public void setCurrentPage(int index, boolean isAnim) { 
  122.         previousIndex = currentIndex; //   
  123.         currentIndex = index; //   
  124.         mViewPager.setCurrentItem(index, isAnim); //  ViewPager  
  125.         // Title ViewPager  
  126.     } 
  127.  
  128.     //   
  129.     private void setImagePosition(int index) { 
  130.         previousIndex = currentIndex; //   
  131.         currentIndex = index; //   
  132.         if (null == mBgImage) { 
  133.             return
  134.         } 
  135.         LayoutParams params = (RelativeLayout.LayoutParams) mBgImage 
  136.                 .getLayoutParams(); //   
  137.         View item = mItemViews.get(index); //   
  138.         //  :UI getLeft()  
  139.         int targetLeftMargin = (int) (item.getLeft() + item.getWidth() / 2.0 - mBgImage 
  140.                 .getWidth() / 2.0); //   
  141.         //  , setLayoutParams(...) 
  142.         if (params.leftMargin == targetLeftMargin) { 
  143.             return
  144.         } 
  145.         params.leftMargin = targetLeftMargin; 
  146.         mBgImage.setLayoutParams(params); //   
  147.     } 
  148.  
  149.     //   
  150.     private void moveImagePosition(int offset) { 
  151.         if (null == mBgImage) { 
  152.             return
  153.         } 
  154.         LayoutParams params = (RelativeLayout.LayoutParams) mBgImage 
  155.                 .getLayoutParams(); //   
  156.         params.leftMargin += offset; 
  157.         mBgImage.setLayoutParams(params); //   
  158.     } 
  159.  
  160.     /* 
  161.      *  , 。 
  162.      * arg0: 。 0, 。 
  163.      * arg1: ,[0, 1)。( ) 
  164.      * arg2: 。( ) 
  165.      */ 
  166.     @Override 
  167.     public void onPageScrolled(int position, float positionOffset, 
  168.             int positionOffsetPixels) { 
  169.         //  , positionOffsetPixels : 
  170.         // 1)position, ,  
  171.         // 2)positionOffset, 0.0, float  
  172.         // 3)positionOffsetPixels, 0,int ^^ 
  173.         if (positionOffsetPixels == 0) { 
  174.             setImagePosition(position); 
  175.             prevOffset = -1
  176.             isTitleClicked = false
  177.             return
  178.         } 
  179.         //  ,  
  180.         if (prevOffset == -1) { 
  181.             prevOffset = positionOffsetPixels; 
  182.             return
  183.         } 
  184.         int pageOffset = positionOffsetPixels - prevOffset; //   
  185.         prevOffset = positionOffsetPixels; 
  186.         if (null != mBgImage) { 
  187.             try { 
  188.                 if (pageOffset 0) { //  ->  
  189.                     int prevIndex, nextIndex; 
  190.                     if (isTitleClicked) { 
  191.                         prevIndex = previousIndex; 
  192.                         nextIndex = currentIndex; 
  193.                     } else { 
  194.                         prevIndex = currentIndex; 
  195.                         nextIndex = currentIndex - 1
  196.                     } 
  197.                     //   
  198.                     int itemDistance = mItemViews.get(prevIndex).getLeft() 
  199.                             - mItemViews.get(nextIndex).getLeft(); 
  200.                     //   
  201.                     int p_w_picpathOffset = pageOffset * itemDistance 
  202.                             / mViewPager.getWidth(); 
  203.                     //   
  204.                     moveImagePosition(p_w_picpathOffset); 
  205.                 } else if (pageOffset > 0) { //  ->  
  206.                     int prevIndex, nextIndex; 
  207.                     if (isTitleClicked) { 
  208.                         prevIndex = previousIndex; 
  209.                         nextIndex = currentIndex; 
  210.                     } else { 
  211.                         prevIndex = currentIndex; 
  212.                         nextIndex = currentIndex + 1
  213.                     } 
  214.                     //   
  215.                     int itemDistance = mItemViews.get(nextIndex).getLeft() 
  216.                             - mItemViews.get(prevIndex).getLeft(); 
  217.                     //   
  218.                     int p_w_picpathOffset = pageOffset * itemDistance 
  219.                             / mViewPager.getWidth(); 
  220.                     //   
  221.                     moveImagePosition(p_w_picpathOffset); 
  222.                 } 
  223.             } catch (IndexOutOfBoundsException e) { 
  224.                 //  ==, T^T 
  225.                 setImagePosition(currentIndex); 
  226.                 isTitleClicked = false
  227.             } 
  228.         } 
  229.         if (null != mOnPageChangeListener) { 
  230.             mOnPageChangeListener.onPageScrolled(position, positionOffset, 
  231.                     positionOffsetPixels); 
  232.         } 
  233.     } 
  234.  
  235.     /* 
  236.      *  。 。 
  237.      * arg0:  
  238.      */ 
  239.     @Override 
  240.     public void onPageSelected(int position) { 
  241.         if (null != mOnPageChangeListener) { 
  242.             mOnPageChangeListener.onPageSelected(position); 
  243.         } 
  244.     } 
  245.  
  246.     /* 
  247.      *  。 、 ( )、 / 。 
  248.      * arg0: 。SCROLL_STATE_DRAGGING、SCROLL_STATE_SETTLING、SCROLL_STATE_IDLE 
  249.      */ 
  250.     @Override 
  251.     public void onPageScrollStateChanged(int state) { 
  252.         if (state == ViewPager.SCROLL_STATE_DRAGGING) { //   
  253.             isTitleClicked = false
  254.         } 
  255.         if (null != mOnPageChangeListener) { 
  256.             mOnPageChangeListener.onPageScrollStateChanged(state); 
  257.         } 
  258.     } 
  259.  
  260.     //  ViewPager  
  261.     private class MPagerAdapter extends PagerAdapter { 
  262.  
  263.         /* 
  264.          *  。 , finishUpdate() 。 
  265.          * arg0: , 。 
  266.          * arg1:  
  267.          * arg2: instantiateItem(View, int)  
  268.          */ 
  269.         @Override 
  270.         public void destroyItem(View arg0, int arg1, Object arg2) { 
  271.             ((ViewPager) arg0).removeView(mPageViews.get(arg1)); 
  272.         } 
  273.  
  274.         /* 
  275.          *  。 , 。 
  276.          * arg0: ,  
  277.          */ 
  278.         @Override 
  279.         public void finishUpdate(View arg0) { 
  280.         } 
  281.  
  282.         //   
  283.         @Override 
  284.         public int getCount() { 
  285.             return mPageViews.size(); 
  286.         } 
  287.  
  288.         /* 
  289.          *  。 , finishUpdate() 。 
  290.          * arg0: , 。 
  291.          * arg1:  
  292.          * Object: 。 View, 。 
  293.          */ 
  294.         @Override 
  295.         public Object instantiateItem(View arg0, int arg1) { 
  296.             ((ViewPager) arg0).addView(mPageViews.get(arg1), 0); 
  297.             return mPageViews.get(arg1); 
  298.         } 
  299.  
  300.         //   
  301.         @Override 
  302.         public boolean isViewFromObject(View arg0, Object arg1) { 
  303.             return arg0 == (arg1); 
  304.         } 
  305.  
  306.         //   
  307.         @Override 
  308.         public void restoreState(Parcelable arg0, ClassLoader arg1) { 
  309.         } 
  310.  
  311.         //  ,  
  312.         @Override 
  313.         public Parcelable saveState() { 
  314.             return null
  315.         } 
  316.  
  317.         /* 
  318.          *   
  319.          * arg0: ,  
  320.          */ 
  321.         @Override 
  322.         public void startUpdate(View arg0) { 
  323.         } 
  324.     } 
  325.  
  326.     @Override 
  327.     public void onClick(View v) { 
  328.         int size = mItemViews.size(); //   
  329.         for (int i = 0; i 
  330.             if (mItemViews.get(i).getId() == v.getId()) { 
  331.                 isTitleClicked = true
  332.                 setCurrentPage(i, true); 
  333.                 break
  334.             } 
  335.         } 
  336.     } 
  337.  
  338.     //   
  339.     public ArrayList getItemViews() { 
  340.         return mItemViews; 
  341.     } 
  342.  
  343.     //     
  344.     public ArrayList getPageViews() { 
  345.         return mPageViews; 
  346.     } 
  347.  
  348.     //   
  349.     public void setOnPageChangeListener(OnPageChangeListener listener) { 
  350.         mOnPageChangeListener = listener; 
  351.     } 
  352.  
 
 
Android
カスタムコンポーネント(2)
 
添付ファイルの工事、(二)を参照してください.