三行代码接入,社交软件打字时底下弹出的表情布局,自定义ViewPager+页面点标+各种功能的android小框架。

简介: (转载请声明出处:http://www.cnblogs.com/linguanh/) 前言:       接上次分享的 ListView 动态加载类,入口:http://www.cnblogs.com/linguanh/p/4645115.html  这次分享给大家的是,刚些写好的类似社交软件打字时地下弹出的表情布局。

(转载请声明出处:http://www.cnblogs.com/linguanh/)

前言:

      接上次分享的 ListView 动态加载类,入口:http://www.cnblogs.com/linguanh/p/4645115.html  这次分享给大家的是,刚些写好的类似社交软件打字时地下弹出的表情布局。 先看下我的默认效果图。

     该效果图里面使用的图片资源,是默认的IC_lanucher,在我的类里面,你可以自定义,包括布局,几行几列,什么的,都可以自定义。底下的是小点标。

     下集预告:我将在使用这个框架的前提下实现,在输入框中添加表情图片,实现评论、发帖功能!

 

使用简介:

     无论你是使用我提供的默认功能,还是使用接口自定义自己的功能,不变的有,它从底部弹出,拥有点标随ViewPager侧滑而跟踪显示,拥有侧滑功能。

       你可以做的是:

             1,使用我默认的布局,图片,页面;

             2,自定义所有图片,自定义布局,自定义行列数,自定义页面数目,自定义ViewPager 里面要显示的 View,自定义所有的点击,触屏事件。

 

       共有3个类,分别是GridViewActivity、GridViewPagerAdapter、GridViewConfigtion。

       关系:你的Activity先实例化GridViewActivity,然后它会实例化GridViewPagerAdapter,最后的GridViewConfigtion被Adapter实例化,你也可以单独使用最后一个。

       分别负责:

                   底部弹出的父布局配置和先行数据配置,例如默认的行列计算;

                   ViewPager 数据适配器;

                   ViewPager 中所要显示的页面的配置。

GridViewActivity:

       该类没继承Activity,它采用动态引入我定义的xml 文件,里面FrameLayout是所有View的父布局,它将会包裹 ViewPager 和底下的 点标 父亲布局。

        1,共设置两个构造函数:

              第一个是供用户你选择自己定义 ViewPager 里面的子页面时调用的,需要你传入上下文context 和页面数目;

              第二个是在采用我提供的默认布局时,调用的,所谓默认布局就是如上图所示,只有一张表情图片,有行,有列,需要你传                        入上下文、和是否采用默认行列算法的boolean值。因为我在此类还留有你在选择默认布局时的自定义行列计算算法                        接口。

        2,底下点标的的配置和显示也在此类内完成;

        3,ViewPager 的OnPageChangeListener 接口也在此类实现,在这里的目的是实现 点标的变化;

        4,所留接口,customConfigGridViewListener,作用是让你自己定义所以要显示的表情图片,点标图片,行列数:

                   共重写4个函数:

public void setCustomGridSize();  设置自定义行、列、页数目,
public int[] setIntExpressionImages(); 设置传入的图片类型,这里是图片id数组
public Bitmap[] setBitmapExpressionImages(); 这里是bitmap类型
public int[] setIntPointImages(); 点标图片,int数组类型
public Bitmap[] setBitmapPointImages(); 点标数组,bitmap类型。

注意!上述自定义的自定义图片,二选一,若两种都传入,则优先覆盖Bitmap的。setCustomGridSize()要求你必须要设置好行、列、页数。

 

GridViewPagerAdapter:

        该类继承于 PagerAdapter,主要负责页面数目的配置。

        1,三个构造函数:

             第一个是供用户你选择自己定义 ViewPager 里面的子页面时调用的,需要你传入上下文context 和页面数目;

             第二个和第三个都是你选择默认布局时要调用的,区别在于,一个传入是int数组型图片id,另一个是Bitmap。

 

GridViewConfigtion:

       这个类只继承了两个接口,一个是onClick,另一个是onTouch,因为它只要是负责构建 ViewPager 里面要显示的 View。

       1,三个构造函数,具体意义见 GridViewPagerAdapter 的构造函数介绍;

       2,所留接口共两个,自定义页面接口 addCustomView,默认页面几点、Touch事件接口。

       注意!如果你使用的是自定义的View,那么请在这个接口的函数里面连带 点击或者触屏事件写进去。

 

用法介绍:

        我标题起的是三行代码接入。就是这么简单。首先你需要在你自己的 activity、fragment或者其他,实例化一个GridViewActivity 对象,然后使用该对象的 getFather()函数,就能返回整个View了。

        最后一行是,实现自定义监听事件,显示继承GridViewConfigtion.addDefaultViewClick 接口,

        然后使用这句绑定接口:

        GridViewActivity 对象.myVPAdapter.gridViewConfiger.setDefaultViewClickListener(this); 即可。

        其他的自定义,你要设置就自己实现接口,重写即可。

 

代码:

     按照顺序。提示,GridViewActivity 里面默认的 R.drawable.ic_launcher 是我R文件里面的,如果提示找不到就自己改了。

 

 

  1 package com.lgh.addItemListview.mymodule.app2;
  2 
  3 import android.content.Context;
  4 import android.graphics.Bitmap;
  5 import android.support.v4.view.ViewPager;
  6 import android.util.Log;
  7 import android.view.Gravity;
  8 import android.view.LayoutInflater;
  9 import android.view.View;
 10 import android.view.WindowManager;
 11 import android.view.animation.Animation;
 12 import android.view.animation.TranslateAnimation;
 13 import android.widget.FrameLayout;
 14 import android.widget.ImageView;
 15 import android.widget.LinearLayout;
 16 
 17 /**
 18  * Created by LinGuanHong(林冠宏) on 2015/7/17.
 19  */
 20 public class GridViewActivity{
 21 
 22     private View gva;
 23     private Boolean isFristTime = true;//是否第一次进入到 ViewPager
 24     private customConfigGridViewListener coustomConfigtion;
 25     private Boolean isSetDefault = false;//用户是否使用默认的 行列数计算,默认是否
 26     private Context context;
 27     private FrameLayout father;
 28     private Animation animShow;
 29     private ViewPager myViewPager;
 30     public GridViewPagerAdapter myVPAdapter;
 31     private LinearLayout container,secondFather,thridFather;
 32 
 33     public int intTypeEachPagerLines=0;
 34     public int intTypeEachPagerColumns=0;
 35     public int intTypeViewPagerSize;//一共有多少页
 36 
 37     public int[] expressionImage = null;
 38     public int[] pointImages = null;
 39     public Bitmap[] expressionBitmaps = null;
 40     public Bitmap[] pointBitmaps = null;
 41 
 42     public GridViewActivity(Context context,int pagerSize){ // viewPager里面的页面完全自定义构造函数
 43         this.context = context;
 44         this.intTypeViewPagerSize = pagerSize;
 45         if(coustomConfigtion!=null) { //先判断店标图片接口对象是否是空
 46             pointBitmaps = getCustomGridViewListener().setBitmapPointImages();
 47             pointImages = getCustomGridViewListener().setIntPointImages();
 48         } //点标布局是全局的,不属于ViewPager,所以这里也要加入
 49         if (pointImages == null && pointBitmaps == null) {
 50             setDefaultPointImages(); //启用默认点标 图片
 51         }
 52         initAll();
 53     }
 54 
 55     public GridViewActivity(Context context,Boolean isSetDefault){
 56         this.context = context;
 57         this.isSetDefault = isSetDefault;
 58 
 59         //采用先调用接口,再判断,防止用户传入空数组,且,二选一,若两种都传入,则优先覆盖Bitmap的
 60         if(coustomConfigtion!=null) { //先判断接口对象是否是空
 61             expressionBitmaps = getCustomGridViewListener().setBitmapExpressionImages();
 62             expressionImage = getCustomGridViewListener().setIntExpressionImages();
 63             pointBitmaps = getCustomGridViewListener().setBitmapPointImages();
 64             pointImages = getCustomGridViewListener().setIntPointImages();
 65 
 66         }
 67         if (expressionImage == null && expressionBitmaps == null) {
 68             setDefaultExpressionImages(); //启用默认表情图片
 69         }
 70         if (pointImages == null && pointBitmaps == null) {
 71             setDefaultPointImages(); //启用默认点标 图片
 72         }
 73 
 74         if(this.isSetDefault){//判断用户是否使用默认 行、列、页
 75             setDefaultGridSize();//启用默认行列页配置
 76         }else{
 77             //如果用户没采用默认的,那么调用接口,该接口要求用户必须自定义设置:行数,页数,列数
 78             getCustomGridViewListener().setCustomGridSize();
 79         }
 80         initAll();
 81     }
 82 
 83     private void initAll(){
 84         gva = LayoutInflater.from(context).inflate(R.layout.gridview,null,true);
 85         myViewPager = new ViewPager(context);
 86 
 87         animShow = new TranslateAnimation( //设置 弹出动画,这个不想提供接口,你想的话就改我类吧
 88                 Animation.RELATIVE_TO_SELF, 0,
 89                 Animation.RELATIVE_TO_SELF, 0,
 90                 Animation.RELATIVE_TO_SELF, 1,
 91                 Animation.RELATIVE_TO_SELF, 0);
 92         animShow.setDuration(500);
 93 
 94         if(expressionImage!=null){ //如果 是 int 型图片id 数组,采用第一类构造函数
 95             myVPAdapter = new GridViewPagerAdapter
 96                     (
 97                             context,
 98                             expressionImage,//传入 表情 图片
 99                             intTypeEachPagerLines,//行数
100                             intTypeEachPagerColumns,//列数
101                             intTypeViewPagerSize//页数
102                     );
103         }else if(expressionBitmaps!=null){
104             myVPAdapter = new GridViewPagerAdapter
105                     (
106                             context,
107                             expressionBitmaps,//传入 表情 图片
108                             intTypeEachPagerLines,//行数
109                             intTypeEachPagerColumns,//列数
110                             intTypeViewPagerSize//页数
111                     );
112         }else{ //第三类构造,整个 ViewPager 页面,你来自定义
113             myVPAdapter = new GridViewPagerAdapter
114                     (
115                             context,
116                             intTypeViewPagerSize//页数
117                     );
118         }
119         if(gva!=null) {
120             container = (LinearLayout) gva.findViewById(R.id.container);
121             container.setMinimumHeight(200);
122             secondFather = (LinearLayout) gva.findViewById(R.id.secondFather);
123             secondFather.setMinimumHeight(180);
124             thridFather = (LinearLayout) gva.findViewById(R.id.thridFather);
125             thridFather.setMinimumHeight(20);
126         }
127         //设置滑动时的小标记点
128         LinearLayout.LayoutParams layoutParamTypePointsSize =
129                 new LinearLayout.LayoutParams
130                         (
131                                 LinearLayout.LayoutParams.MATCH_PARENT,
132                                 LinearLayout.LayoutParams.WRAP_CONTENT
133                         );
134         LinearLayout pointLinear = new LinearLayout(context);
135         pointLinear.setLayoutParams(layoutParamTypePointsSize);
136         pointLinear.setGravity(Gravity.CENTER_HORIZONTAL);
137         final ImageView[] points = new ImageView[intTypeViewPagerSize];
138         for (int k =0;k<points.length;k++){
139             points[k] = new ImageView(context);
140             points[k].setScaleType(ImageView.ScaleType.CENTER_INSIDE);
141             if(pointImages!=null){
142                 points[k].setImageResource(pointImages[0]);
143             }else{
144                 points[k].setImageBitmap(pointBitmaps[0]);
145             }
146             LinearLayout.LayoutParams pointSize = new LinearLayout.LayoutParams(10, 10);
147             pointSize.setMargins(5, 5, 5, 5);
148             points[k].setLayoutParams(pointSize);
149             pointLinear.addView(points[k]);
150         }
151 
152         myViewPager.setAdapter(myVPAdapter);
153         myViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
154             @Override
155             public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
156                 //设置首次显示时,第一个点标变色,onPageSelected 第一次进入是不会取到 position 的
157                 if(position==0 && isFristTime){
158                     if(pointImages!=null) {
159                         points[position].setImageResource(pointImages[1]);
160                     }
161                 }
162             }
163 
164             @Override
165             public void onPageSelected(int position) {
166                 isFristTime = false;
167                 Log.d("", "position is " + position);
168                 if(pointImages!=null){
169                     if (null != points[position]) {//当前页下标 变色
170                         points[position].setImageResource(pointImages[1]);
171                     }
172                     //当前页的前一页和后一页恢复颜色
173                     if (((position - 1) != -1 && (position + 1) < points.length)) {//中间
174                         points[position - 1].setImageResource(pointImages[0]);
175                         points[position + 1].setImageResource(pointImages[0]);
176                     }
177                     if ((position - 1) != -1 && (position + 1) == points.length) {//最右边
178                         points[position - 1].setImageResource(pointImages[0]);
179                     }
180                     if ((position - 1) == -1 && (position + 1) < points.length) {//最左边
181                         points[position + 1].setImageResource(pointImages[0]);
182                     }
183                 }else{
184                     if (null != points[position]) {//当前页下标 变色
185                         points[position].setImageBitmap(pointBitmaps[1]);
186                     }
187                     //当前页的前一页和后一页恢复颜色
188                     if (((position - 1) != -1 && (position + 1) < points.length)) {//中间
189                         points[position - 1].setImageBitmap(pointBitmaps[0]);
190                         points[position + 1].setImageBitmap(pointBitmaps[0]);
191                     }
192                     if ((position - 1) != -1 && (position + 1) == points.length) {//最右边
193                         points[position - 1].setImageBitmap(pointBitmaps[0]);
194                     }
195                     if ((position - 1) == -1 && (position + 1) < points.length) {//最左边
196                         points[position + 1].setImageBitmap(pointBitmaps[0]);
197                     }
198                 }
199             }
200 
201             @Override
202             public void onPageScrollStateChanged(int state) {
203 
204             }
205         });
206         secondFather.addView(myViewPager);
207         thridFather.addView(pointLinear);
208         father = (FrameLayout) gva.findViewById(R.id.father);
209         father.clearAnimation();
210         father.startAnimation(animShow);//设置弹出的动画
211     }
212 
213     public void setCoustomGridViewListener(customConfigGridViewListener coustomConfigtion){
214         this.coustomConfigtion = coustomConfigtion;
215     }
216     private customConfigGridViewListener getCustomGridViewListener(){
217         return coustomConfigtion;
218     }
219 
220     private void setDefaultGridSize(){
221         WindowManager wm = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
222         float phoneScreen = wm.getDefaultDisplay().getWidth()/wm.getDefaultDisplay().getHeight();
223         if(phoneScreen<0.6){
224             intTypeEachPagerLines=3;
225             intTypeEachPagerColumns=3;
226             //imageSizeHeight = context.getResources().getDrawable(expressionImage[0]).getIntrinsicHeight()*3;
227         }else if(phoneScreen<0.75){
228             intTypeEachPagerLines=3;
229             intTypeEachPagerColumns=2;
230             //imageSizeHeight = context.getResources().getDrawable(expressionImage[0]).getIntrinsicHeight()*3;
231         }else{
232             intTypeEachPagerLines = 1;
233             //imageSizeHeight = context.getResources().getDrawable(expressionImage[0]).getIntrinsicHeight()+10;
234             if (phoneScreen >= 1.75) {
235                 intTypeEachPagerColumns = 6;
236             } else if (phoneScreen >= 1.5) {
237                 intTypeEachPagerColumns = 5;
238             } else if (phoneScreen >= 1.3) {
239                 intTypeEachPagerColumns = 4;
240             } else {
241                 intTypeEachPagerColumns = 3;
242             }
243         }
244         //计算出 ViewPager 含多少页
245         intTypeViewPagerSize = expressionImage.length/(intTypeEachPagerLines*intTypeEachPagerColumns);
246         //上面是取整
247         if(expressionImage.length%(intTypeEachPagerColumns*intTypeEachPagerColumns)>0){
248             //如果还有余数就增 1
249             intTypeViewPagerSize++;
250         }
251     }
252 
253     public FrameLayout.LayoutParams getParams(){
254         FrameLayout.LayoutParams fatherSize = new FrameLayout.LayoutParams(
255                 FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT);
256         fatherSize.gravity=Gravity.BOTTOM;
257         return fatherSize;
258     }
259 
260     public FrameLayout getFather(){
261         return father;
262     }
263 
264     public interface customConfigGridViewListener{
265         public void setCustomGridSize();
266         public int[] setIntExpressionImages();
267         public Bitmap[] setBitmapExpressionImages();
268         public int[] setIntPointImages();
269         public Bitmap[] setBitmapPointImages();
270     }
271 
272     private void setDefaultExpressionImages(){ // 配置默认表情图片集
273         expressionImage = new int[]{ //默认
274                 com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher,
275                 com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher,
276                 com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher,
277                 com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher,
278                 com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher,
279                 com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher,
280                 com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher,
281                 com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher, com.lgh.addItemListview.mymodule.app2.R.drawable.ic_launcher,
282         };
283 
284     }
285     private void setDefaultPointImages() { // 配置默认点标图片集
286         pointImages = new int[]{//默认
287                 com.lgh.addItemListview.mymodule.app2.R.drawable.gray_point,
288                 com.lgh.addItemListview.mymodule.app2.R.drawable.white_point
289         };
290     }
291 }

 

 

第二个

 

  1 package com.lgh.addItemListview.mymodule.app2;
  2 
  3 import android.content.Context;
  4 import android.graphics.Bitmap;
  5 import android.support.v4.view.PagerAdapter;
  6 import android.view.View;
  7 import android.view.ViewGroup;
  8 
  9 import java.util.ArrayList;
 10 import java.util.List;
 11 
 12 /**
 13  * Created by LinGuanHong(林冠宏) on 2015/7/17.
 14  * 在这里设置有多少页 ViewPager 的 childen
 15  */
 16 public class GridViewPagerAdapter extends PagerAdapter {
 17 
 18     public GridViewConfigtion gridViewConfiger;
 19     private int intTypeEachPagerLines=0;
 20     private int intTypeEachPagerColumns=0;
 21     private int intTypeViewPagerSize;//一共有多少页
 22     private List<View> gridViewLinears;
 23     private Context context;
 24     private int[] expressionImage = null;
 25     private Bitmap[] expressionBitmaps = null;
 26 
 27     public GridViewPagerAdapter(Context context,int pagerSize){ //ViewPager 页面自定义构造
 28         this.context = context;
 29         this.intTypeViewPagerSize = pagerSize;
 30         initAll();
 31     }
 32 
 33     public GridViewPagerAdapter(Context context,int [] expressionImage,int line,int column,int pagerSize){
 34         this.context = context;
 35         this.expressionImage = expressionImage;
 36         this.intTypeEachPagerLines = line;
 37         this.intTypeEachPagerColumns = column;
 38         this.intTypeViewPagerSize = pagerSize;
 39         initAll();
 40     }
 41 
 42     public GridViewPagerAdapter(Context context,Bitmap [] expressionBitmaps,int line,int column,int pagerSize){
 43         this.context = context;
 44         this.expressionBitmaps = expressionBitmaps;
 45         this.intTypeEachPagerLines = line;
 46         this.intTypeEachPagerColumns = column;
 47         this.intTypeViewPagerSize = pagerSize;
 48         initAll();
 49     }
 50 
 51     private void initAll(){
 52         if(intTypeEachPagerLines!=0 && intTypeEachPagerColumns!=0){
 53             if(expressionImage!=null){
 54                 gridViewConfiger = new GridViewConfigtion
 55                         (
 56                                 context,
 57                                 intTypeEachPagerLines,//传进去 行数
 58                                 intTypeEachPagerColumns,//传进去 列数
 59                                 expressionImage//传进去 表情图片数组
 60                         );
 61             }else if(expressionBitmaps!=null){
 62                 gridViewConfiger = new GridViewConfigtion
 63                         (
 64                                 context,
 65                                 intTypeEachPagerLines,//传进去 行数
 66                                 intTypeEachPagerColumns,//传进去 列数
 67                                 expressionBitmaps//传进去 表情图片数组
 68                         );
 69             }else{
 70                 gridViewConfiger = new GridViewConfigtion
 71                         (
 72                                 context
 73                         );
 74             }
 75             gridViewLinears = new ArrayList<View>();
 76             addGridViews();
 77         }
 78     }
 79 
 80     private void addGridViews(){
 81         for(int i = 0 ; i < intTypeViewPagerSize;i++){
 82             gridViewLinears.add(gridViewConfiger.getGridViews());
 83 
 84         }
 85     }
 86 
 87     @Override
 88     public int getCount() {
 89         return gridViewLinears.size();//返回一共有多少页
 90     }
 91 
 92     @Override
 93     public void destroyItem(ViewGroup container, int position,
 94                             Object object) {
 95         // TODO Auto-generated method stub
 96         container.removeView(gridViewLinears.get(position));
 97     }
 98 
 99     @Override
100     public Object instantiateItem(ViewGroup container, int position) {
101         container.addView(gridViewLinears.get(position));
102         return gridViewLinears.get(position);
103     }
104 
105     @Override
106     public boolean isViewFromObject(View view, Object object) {
107         return view == object;
108     }
109 }

 

第三个

  1 package com.lgh.addItemListview.mymodule.app2;
  2 
  3 import android.content.Context;
  4 import android.graphics.Bitmap;
  5 import android.util.Log;
  6 import android.view.Gravity;
  7 import android.view.MotionEvent;
  8 import android.view.View;
  9 import android.widget.ImageView;
 10 import android.widget.LinearLayout;
 11 
 12 /**
 13  * Created by LinGuanHong(林冠宏) on 2015/7/17.
 14  *
 15  */
 16 public class GridViewConfigtion implements View.OnClickListener,View.OnTouchListener{
 17 
 18     private addCustomView myCustonView;
 19     private addDefaultViewClick myOnClilkTouch;
 20     private Context context;
 21     private int imagesIndex = -1;//统计已经加入九宫格的图片数量
 22     private int intTypeEachPagerLines=0;
 23     private int intTypeEachPagerColumns=0;
 24 
 25     private int[] expressionImage = null;
 26     private Bitmap[] expressionBitmaps = null;
 27 
 28     //下面3个 构造函数 所占内存不会增加,除非用户你3个都使用,否则只是增加了 几行 代码
 29     public GridViewConfigtion( //采用 页面自定义构造函数,
 30              Context context)
 31     {
 32         this.context = context;
 33     }
 34 
 35     public GridViewConfigtion( //采用 int id 型的图片构造函数,
 36             Context context,int intTypeEachPagerLines,int intTypeEachPagerColumns,int[] expressionImage)
 37     {
 38         this.context = context;
 39         this.expressionImage = expressionImage;
 40         this.intTypeEachPagerLines = intTypeEachPagerLines;
 41         this.intTypeEachPagerColumns = intTypeEachPagerColumns;
 42     }
 43     public GridViewConfigtion(//采用 Bitmap 型的图片构造函数
 44             Context context,int intTypeEachPagerLines,int intTypeEachPagerColumns,Bitmap[] expressionBitmaps)
 45     {
 46         this.context = context;
 47         this.expressionBitmaps = expressionBitmaps;
 48         this.intTypeEachPagerLines = intTypeEachPagerLines;
 49         this.intTypeEachPagerColumns = intTypeEachPagerColumns;
 50     }
 51 
 52 
 53     public void setCustomViewListener(addCustomView myCustonView){
 54         this.myCustonView = myCustonView;
 55     }
 56 
 57     public void setDefaultViewClickListener(addDefaultViewClick myOnClilkTouch){
 58         this.myOnClilkTouch = myOnClilkTouch;
 59     }
 60 
 61     private addCustomView getCustomViewListener(){
 62         return myCustonView;
 63     }
 64 
 65     private addDefaultViewClick getDefaultViewClickListener(){
 66         return myOnClilkTouch;
 67     }
 68 
 69     public View getGridViews(){
 70         View result = null;
 71         if(myCustonView!=null) {
 72             result = getCustomViewListener().setCustomView();
 73         }
 74         if(result==null){
 75             return getDefaultView();
 76         }else{
 77             return result;
 78         }
 79     }
 80 
 81     private View getDefaultView(){
 82         LinearLayout resultViews = new LinearLayout(context);
 83         LinearLayout.LayoutParams layoutParamTypeResultViewSize =
 84                 new LinearLayout.LayoutParams
 85                         (
 86                                 LinearLayout.LayoutParams.MATCH_PARENT,
 87                                 LinearLayout.LayoutParams.WRAP_CONTENT
 88                         );
 89         resultViews.setLayoutParams(layoutParamTypeResultViewSize);
 90         resultViews.setOrientation(LinearLayout.VERTICAL);
 91         LinearLayout.LayoutParams layoutParamTypeLineSize =
 92                 new LinearLayout.LayoutParams
 93                         (
 94                                 LinearLayout.LayoutParams.MATCH_PARENT,
 95                                 LinearLayout.LayoutParams.MATCH_PARENT
 96                         );
 97         layoutParamTypeLineSize.weight = 1;
 98         //layoutParamTypeLineSize.gravity=LinearLayout.VERTICAL;
 99         LinearLayout.LayoutParams layoutParamTypeViewSize =
100                 new LinearLayout.LayoutParams
101                         (
102                                 LinearLayout.LayoutParams.MATCH_PARENT,
103                                 LinearLayout.LayoutParams.MATCH_PARENT
104                         );
105         layoutParamTypeViewSize.weight = 1;
106         for(int i =0;i<intTypeEachPagerLines;i++){
107             LinearLayout eachLineLinear = new LinearLayout(context);
108             eachLineLinear.setLayoutParams(layoutParamTypeLineSize);
109             eachLineLinear.setPadding(5, 0, 5, 0);
110             resultViews.addView(eachLineLinear);//把行,父View添加到当前的grid中
111             for(int j=0;j<intTypeEachPagerColumns;j++){
112                 Log.d("----","index is "+imagesIndex);
113                 imagesIndex++;
114                 if(imagesIndex>=expressionImage.length){
115                     //到这里,已全部加完
116                     break;
117                 }
118                 LinearLayout eachExpressionLinear = new LinearLayout(context);//表情的直系父View
119                 eachExpressionLinear.setGravity(Gravity.CENTER);//设置子控件居中
120                 eachExpressionLinear.setLayoutParams(layoutParamTypeViewSize);
121                 ImageView imageViewTypeExpression = new ImageView(context);
122                 imageViewTypeExpression.setOnClickListener(this);//加上监听事件
123                 if(expressionImage!=null) { //int的不是空,证明 不是 bitmap
124                     imageViewTypeExpression.setImageResource(expressionImage[imagesIndex]);
125                 }else{
126                     imageViewTypeExpression.setImageBitmap(expressionBitmaps[imagesIndex]);
127                 }
128                 eachExpressionLinear.addView(imageViewTypeExpression);//添加到 直系父 View
129                 eachLineLinear.addView(eachExpressionLinear); // 把图片的直系View 添加到 行View
130             }
131         }//所有行的结束,组成一页 gridView
132         return resultViews;
133     }
134 
135     @Override
136     public void onClick(View v) {
137         if(myOnClilkTouch!=null) {
138             getDefaultViewClickListener().setOnClick(v);
139         }
140     }
141 
142     @Override
143     public boolean onTouch(View v, MotionEvent event) {
144         return myOnClilkTouch != null && getDefaultViewClickListener().setOnTouch(v, event);
145     }
146 
147     public interface addCustomView{ //自定义页面接口
148         public View setCustomView();
149     }
150 
151     public  interface addDefaultViewClick{
152         public boolean setOnTouch(View v, MotionEvent event); // onTouch 接口
153         public void setOnClick(View v); //onClick 接口
154     }
155 }

 

 1 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:id="@+id/father"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:background="#64cfcfcf"
 7     tools:context=".MainActivity">
 8     <LinearLayout
 9         android:id="@+id/container"
10         android:layout_gravity="bottom"
11         android:orientation="vertical"
12         android:layout_width="match_parent"
13         android:layout_height="200dp">
14         <LinearLayout
15             android:id="@+id/secondFather"
16             android:orientation="vertical"
17             android:layout_width="match_parent"
18             android:layout_height="180dp">
19 
20         </LinearLayout>
21         <LinearLayout
22             android:id="@+id/thridFather"
23             android:orientation="vertical"
24             android:layout_width="match_parent"
25             android:layout_height="wrap_content">
26 
27         </LinearLayout>
28 
29    </LinearLayout>
30 
31 </FrameLayout>

 

测试例子 activity

 1 import android.app.Activity;
 2 import android.os.Bundle;
 3 import android.view.Menu;
 4 import android.view.MenuItem;
 5 import android.view.MotionEvent;
 6 import android.view.View;
 7 import android.widget.Toast;
 8 
 9 import com.lgh.addItemListview.mymodule.app2.GridViewActivity;
10 import com.lgh.addItemListview.mymodule.app2.GridViewConfigtion;
11 
12 
13 public class MainActivity extends Activity implements GridViewConfigtion.addDefaultViewClick {
14 
15     private GridViewActivity grid;
16 
17     @Override
18     protected void onCreate(Bundle savedInstanceState) {
19         super.onCreate(savedInstanceState);
20         setContentView(R.layout.gridview);
21         grid = new GridViewActivity(this,true);
22         addContentView(grid.getFather(),grid.getParams());
23         //设置每张表情图片的点击,触屏监听,如果你选择的是完全自定义,请别这样做
24         //完全自定义的 ViewPager 页面,请在接口处设置监听对象
25         grid.myVPAdapter.gridViewConfiger.setDefaultViewClickListener(this);
26     }
27 
28 
29     @Override
30     public boolean onCreateOptionsMenu(Menu menu) {
31         // Inflate the menu; this adds items to the action bar if it is present.
32         getMenuInflater().inflate(com.lgh.addItemListview.mymodule.app2.R.menu.main, menu);
33         return true;
34     }
35 
36     @Override
37     public boolean onOptionsItemSelected(MenuItem item) {
38         int id = item.getItemId();
39         if (id == com.lgh.addItemListview.mymodule.app2.R.id.action_settings) {
40             return true;
41         }
42         return super.onOptionsItemSelected(item);
43     }
44 
45     @Override
46     public boolean setOnTouch(View v, MotionEvent event) {
47        // 自定义onTouch
48         return false;
49     }
50 
51     @Override
52     public void setOnClick(View v) {
53         //我这里自定义了 ImageView 的点击事件,在继承我的接口的前提下
54         Toast.makeText(this,"i am the fucking picture!",Toast.LENGTH_LONG).show();
55     }
56 }

 

 

如果您认为这篇文章还不错或者有所收获,您可以通过扫描一下下面的支付宝二维码 打赏我一杯咖啡【物质支持】,也可以点击右下角的【推荐】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力


img_12e3f54d4d0f70f0eb14f20548e3d781.png
目录
相关文章
|
1月前
|
Android开发 开发者
安卓应用开发中的自定义视图
【9月更文挑战第37天】在安卓开发的海洋中,自定义视图犹如一座座小岛,等待着勇敢的探索者去发现其独特之处。本文将带领你踏上这段旅程,从浅滩走向深海,逐步揭开自定义视图的神秘面纱。
35 3
|
22天前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
|
29天前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
61 0
|
4天前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
5天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
18 5
|
3天前
|
算法 JavaScript Android开发
|
1月前
|
Android开发
Android开发表情emoji功能开发
本文介绍了一种在Android应用中实现emoji表情功能的方法,通过将图片与表情字符对应,实现在`TextView`中的正常显示。示例代码展示了如何使用自定义适配器加载emoji表情,并在编辑框中输入或删除表情。项目包含完整的源码结构,可作为开发参考。视频演示和源码详情见文章内链接。
63 4
Android开发表情emoji功能开发
|
13天前
|
安全 Android开发 iOS开发
Android vs iOS:探索移动操作系统的设计与功能差异###
【10月更文挑战第20天】 本文深入分析了Android和iOS两个主流移动操作系统在设计哲学、用户体验、技术架构等方面的显著差异。通过对比,揭示了这两种系统各自的独特优势与局限性,并探讨了它们如何塑造了我们的数字生活方式。无论你是开发者还是普通用户,理解这些差异都有助于更好地选择和使用你的移动设备。 ###
25 3
|
13天前
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
46 1
|
29天前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。