上个图:

1、FaceGridView.java

package com.example.test;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import android.content.Context;
import android.graphics.Color;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.AdapterView.OnItemClickListener;
public class FaceGridView extends LinearLayout {private Context _context;private ViewPager _viewPager;private LinearLayout _llDot;private OnFaceGridViewItemClick onFaceGridViewItemClick;private ImageView[] dots;/** ViewPager当前页 */private int currentIndex;/** ViewPager页数 */private int viewPager_size;/** 默认一页20个item */private double pageItemCount = 20d;/** 保存每个页面的GridView视图 */private List<GridView> list_Views;/** viewpage高度 */private int viewPageHeight = 380;/** viewpage背景颜色 */private int backColor = 0xffcccfd0;/** assets图片名 */public String[] faceNames;/** assets图片路径 */private String facePath = "faces";/** assets 返回按钮图片 */private String backBtnName = "back_normal.png";public FaceGridView(Context context) {super(context);_context = context;initViewPage();initFootDots();}public FaceGridView(Context context, AttributeSet attrs) {super(context, attrs);_context = context;initViewPage();initFootDots();}private void initViewPage() {setOrientation(VERTICAL);setBackgroundColor(backColor);// 灰色_viewPager = new ViewPager(_context);_llDot = new LinearLayout(_context);_viewPager.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, viewPageHeight));_llDot.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));_llDot.setGravity(Gravity.CENTER);_llDot.setOrientation(HORIZONTAL);addView(_viewPager);addView(_llDot);}private void initFootDots() {try {faceNames = getResources().getAssets().list(facePath);} catch (IOException e) {e.printStackTrace();}viewPager_size = (int) Math.ceil(faceNames.length / pageItemCount);if (0 < viewPager_size) {if (viewPager_size == 1) {_llDot.setVisibility(View.GONE);} else {_llDot.setVisibility(View.VISIBLE);for (int i = 0; i < viewPager_size; i++) {ImageView image = new ImageView(_context);image.setTag(i);LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(20, 20);params.setMargins(5, 5, 5, 15);// 两种调用图片方式image.setBackgroundDrawable(DotFile.setStateDrawable());// image.setBackgroundResource(R.drawable.dots_set);image.setEnabled(false);_llDot.addView(image, params);}}}if (1 != viewPager_size) {dots = new ImageView[viewPager_size];for (int i = 0; i < viewPager_size; i++) {dots[i] = (ImageView) _llDot.getChildAt(i);dots[i].setEnabled(true);dots[i].setTag(i);}currentIndex = 0;dots[currentIndex].setEnabled(false);_viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageSelected(int arg0) {setCurDot(arg0);}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageScrollStateChanged(int arg0) {}});}}private void setCurDot(int position) {if (position < 0 || position > viewPager_size - 1 || currentIndex == position) {return;}dots[position].setEnabled(false);dots[currentIndex].setEnabled(true);currentIndex = position;}public void setAdapter() {if (onFaceGridViewItemClick == null) {Log.e("tag", "请先实现接口OnFaceGridViewItemClick");return;}list_Views = new ArrayList<GridView>();for (int i = 0; i < viewPager_size; i++) {list_Views.add(getViewPagerItem(i));}_viewPager.setAdapter(new ViewPageAdapter(list_Views));}/** 生成gridView数据 */private String[] getGridViewData(int index) {index++;int startPos = (index - 1) * 20;int endPos = index * 20;int length = 0;if (endPos > faceNames.length) {endPos = faceNames.length - 1;}length = endPos - startPos + 1;String[] tmps = new String[length];int num = 0;for (int i = startPos; i < endPos; i++) {tmps[num] = facePath + "/" + faceNames[i];num++;}tmps[length - 1] = backBtnName;return tmps;}private GridView getViewPagerItem(int index) {GridView gridView = new GridView(_context);gridView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));gridView.setNumColumns(7);gridView.setVerticalScrollBarEnabled(false);gridView.setHorizontalScrollBarEnabled(false);gridView.setBackgroundColor(Color.TRANSPARENT);gridView.setAdapter(new GridViewAdapter(_context, getGridViewData(index)));gridView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {for (int i = 0; i < faceNames.length; i++) {if ((facePath + "/" + faceNames[i]).hashCode() == id) {onFaceGridViewItemClick.onItemClick(i);}}}});return gridView;}public void setOnFaceGridViewItemClick(OnFaceGridViewItemClick onFaceGridViewItemClick) {this.onFaceGridViewItemClick = onFaceGridViewItemClick;}public interface OnFaceGridViewItemClick {public void onItemClick(int facesPos);}
}

2、GridViewAdapter.java

package com.example.test;import java.io.IOException;
import java.io.InputStream;import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView.LayoutParams;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;public class GridViewAdapter extends BaseAdapter {private Context context;private String[] facesName;private AssetManager assetManager;public GridViewAdapter(Context context, String[] facesName) {this.context = context;this.facesName = facesName;assetManager = context.getResources().getAssets();}@Overridepublic int getCount() {return facesName.length;}@Overridepublic Object getItem(int position) {return facesName[position];}@Overridepublic long getItemId(int position) {return facesName[position].hashCode();}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {GridViewHolder gridViewHolder = null;if (convertView == null) {gridViewHolder = new GridViewHolder();convertView = gridViewHolder.layoutView;convertView.setTag(gridViewHolder);} else {gridViewHolder = (GridViewHolder) convertView.getTag();}gridViewHolder.faceIv.setImageBitmap(getBitmap(position));return convertView;}private Bitmap getBitmap(int position) {Bitmap bitmap = null;InputStream is = null;try {is = assetManager.open(facesName[position]);bitmap = BitmapFactory.decodeStream(is);} catch (IOException e) {e.printStackTrace();}is = null;return bitmap;}public class GridViewHolder {public LinearLayout layoutView;public ImageView faceIv;public GridViewHolder() {LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);layoutView = new LinearLayout(context);faceIv = new ImageView(context);layoutView.setLayoutParams(layoutParams);layoutView.setOrientation(LinearLayout.VERTICAL);layoutView.setGravity(Gravity.CENTER);LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(80, 80);params.setMargins(0, 20, 0, 20);layoutView.addView(faceIv, params);}}
}

3、ViewPageAdapter.java

package com.example.test;import java.util.List;import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.GridView;public class ViewPageAdapter extends PagerAdapter {private List<GridView> mListViews;public ViewPageAdapter(List<GridView> mListViews) {this.mListViews = mListViews;// 构造方法,参数是我们的页卡,这样比较方便。}@Overridepublic int getCount() {return mListViews.size();// 返回页卡的数量}@Override  public int getItemPosition(Object object) {  return super.getItemPosition(object);  }  @Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView(mListViews.get(position));// 删除页卡}@Overridepublic Object instantiateItem(ViewGroup container, int position) { // 这个方法用来实例化页卡container.addView(mListViews.get(position), 0);// 添加页卡return mListViews.get(position);}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;// 官方提示这样写}}

4、DotFile.java

package com.example.test;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.StateListDrawable;public class DotFile {private static int[] uPic = {  };//为16进制图片数据private static int[] downPic = { };//为16进制图片数据public static Bitmap getCircle(int which) {Bitmap bm = null;byte[] b = null;switch (which) {case 0:b = new byte[uPic.length];for (int i = 0; i < uPic.length; i++) {b[i] = (new Integer(uPic[i])).byteValue();}bm = BitmapFactory.decodeByteArray(b, 0, b.length);break;case 1:b = new byte[downPic.length];for (int i = 0; i < downPic.length; i++) {b[i] = (new Integer(downPic[i])).byteValue();}bm = BitmapFactory.decodeByteArray(b, 0, b.length);break;}return bm;}public static StateListDrawable setStateDrawable() {StateListDrawable sd = new StateListDrawable();Drawable up = new BitmapDrawable(getCircle(0));Drawable down = new BitmapDrawable(getCircle(1));// 负号代表falsesd.addState(new int[] { -android.R.attr.state_enabled }, down);sd.addState(new int[] { android.R.attr.state_enabled }, up);return sd;}
}

调用方式:

<com.example.test.FaceGridViewandroid:id="@+id/faceGridView1"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_below="@+id/editText" />
faceGridView = (FaceGridView) findViewById(R.id.faceGridView1);
faceGridView.setOnFaceGridViewItemClick(new OnFaceGridViewItemClick() {@Overridepublic void onItemClick(int facesPos) {editText.setText(facesPos+"");}
});
faceGridView.setAdapter();

下载地址: 点击打开链接

自定义控件--仿QQ表情面板相关推荐

  1. Android开发之仿QQ表情实现(上)

    大家晚上好,,小鹿又来了..最近小鹿特别忙,忙到没时间发表博客了(注:以下内容过于简单请大家不要喷,仅提供初学者学习) 今天发表两篇文章,分别是讲解模拟QQ表情的实现,先给大家看效果图,,,, 开始了 ...

  2. Android开发之仿QQ表情实现(下)

    大家中午好,,,,,,小鹿吃草刚回来真是不好意思,,,, 上篇文章已经讲到GirdView的使用,本节内容是基于上篇内容实现更完美的QQ表情的实现,具体的说,本节内容实现的QQ表情是使用了GirdVi ...

  3. Android最完整的仿QQ表情聊天图文展示代码示例

    安卓最完整的表情聊天特效(大家可以看我上一篇文章websocket的整合,这是他的后续) 首先我们需要知道安卓输入的是EditText 显示的内容是TextView, 但是TextView里面又只能显 ...

  4. 1.仿QQ侧滑面板(对ViewGroup的自定义)

    侧滑面板(对ViewGroup的自定义) 应用场景: 扩展主面板的功能 功能实现:1.ViewDragHelper: Google2013年IO大会提出的,>解决界面控件拖拽移动问题. (v4包 ...

  5. android mysql上传头像,Android自定义控件仿QQ编辑和选取圆形头像

    android大家都有很多需要用户上传头像的需求,有的是选方形,有的是圆角矩形,有的是圆形. 首先我们要做一个处理图片的自定义控件,把传入的图片,经过用户选择区域,处理成一定的形状. 有的app是通过 ...

  6. 仿QQ侧滑面板(二)

    1.3 结束动画 1.3.1 跳转的结束动画 1.3.2 平滑的结束动画 1.4 伴随动画 1.4.1 分解伴随动画 1.4.2 实现伴随动画 1.3 结束动画 拖拽过程中当手指抬起时,需要实现一个打 ...

  7. 仿QQ侧滑面板(三)

    1.5 状态更新及事件回调 1.5.1 状态分析 1.5.2 事件回调分析 1.5.2 实现状态更新及事件回调 1.6 触摸优化 1.6.1 填充界面数据 1.6.2 主面板触摸优化 1.5 状态更新 ...

  8. iOS_仿QQ表情键盘

    当UITextFiled和UITextView这种文本输入类控件成为第一响应者时,弹出的键盘由他们的一个UIView类的inputView属性来控制,当inputView为nil时会弹出系统的键盘,想 ...

  9. IM即时通讯项目讲解(一)--实现类似qq微信表情面板无缝切换

    该系列技术课程来源慕课IM实战 带后台的IM即时通讯App 全程MVP手把手打造 通过该课程可以学习到以下知识点 1.了解和开发后台项目(这个是需要长期积累的,有了这个可以说入门没问题) 2.学习到I ...

最新文章

  1. AI 医疗公司“战疫”在前线
  2. Java必会的工具库,让你的代码量减少90%
  3. pandas基于日期信息(time or date)生成季度信息(quarter)实战:pandas基于日期信息列生成季度信息列、dt.quarter生成季度信息、dt.to_period生成季度信息
  4. k8s系列~mgr的应用
  5. 过河卒(Noip2002)
  6. c语言100个学生,输入100名学生的学号,姓名,性别,住址及10门功课,且显示每个学生10门课的最低和最高分,还要显示每门课不及格的学生人数,,还输入一个学号就能显示该学生的信息...
  7. ROS 机器人操作系统进阶实战
  8. E - Olympic Medal CodeForces - 215B(数学 思维)
  9. bob战队 rust_c、rust、golang、swift性能比较
  10. 想红想疯了?人民日报怒批女主播进教室摆拍:如此装束 成何体统
  11. exchange邮箱账号禁用之后 启用方法
  12. python2读文件,python之文件的读写(2)
  13. 图像处理之调整亮度与对比度
  14. 【区块链】——区块链与5G技术的结合
  15. js pug 代码_PUG 系列 | 第二课 JS 代码混合、包含引入
  16. 5分钟了解什么是OpenXR
  17. 58同城自动登录功能 分享给大家!
  18. po、bo、do、dto、vo相关图形
  19. 知云文献翻译打不开_沙拉查词—— 划线翻译的一股清流
  20. 【Redis】Redis数据库

热门文章

  1. input参数问题:TypeError: input expected at most 1 argument, got 3
  2. Angular Render2你了解吗?
  3. ssm附件上传时(mutilpart/form-data)后台接收其他数据为空
  4. 中国欢迎国际社会利用“鹊桥”号中继卫星开展科学研究
  5. Python如何批量修改照片像素大小
  6. 最大公因数和最小公倍数的求法
  7. 计算机知识竞赛口号,知识竞赛口号大全
  8. C++各种头文件及其函数
  9. ios address book
  10. 2004黑客推荐工具