自定义控件--仿QQ表情面板
上个图:
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表情面板相关推荐
- Android开发之仿QQ表情实现(上)
大家晚上好,,小鹿又来了..最近小鹿特别忙,忙到没时间发表博客了(注:以下内容过于简单请大家不要喷,仅提供初学者学习) 今天发表两篇文章,分别是讲解模拟QQ表情的实现,先给大家看效果图,,,, 开始了 ...
- Android开发之仿QQ表情实现(下)
大家中午好,,,,,,小鹿吃草刚回来真是不好意思,,,, 上篇文章已经讲到GirdView的使用,本节内容是基于上篇内容实现更完美的QQ表情的实现,具体的说,本节内容实现的QQ表情是使用了GirdVi ...
- Android最完整的仿QQ表情聊天图文展示代码示例
安卓最完整的表情聊天特效(大家可以看我上一篇文章websocket的整合,这是他的后续) 首先我们需要知道安卓输入的是EditText 显示的内容是TextView, 但是TextView里面又只能显 ...
- 1.仿QQ侧滑面板(对ViewGroup的自定义)
侧滑面板(对ViewGroup的自定义) 应用场景: 扩展主面板的功能 功能实现:1.ViewDragHelper: Google2013年IO大会提出的,>解决界面控件拖拽移动问题. (v4包 ...
- android mysql上传头像,Android自定义控件仿QQ编辑和选取圆形头像
android大家都有很多需要用户上传头像的需求,有的是选方形,有的是圆角矩形,有的是圆形. 首先我们要做一个处理图片的自定义控件,把传入的图片,经过用户选择区域,处理成一定的形状. 有的app是通过 ...
- 仿QQ侧滑面板(二)
1.3 结束动画 1.3.1 跳转的结束动画 1.3.2 平滑的结束动画 1.4 伴随动画 1.4.1 分解伴随动画 1.4.2 实现伴随动画 1.3 结束动画 拖拽过程中当手指抬起时,需要实现一个打 ...
- 仿QQ侧滑面板(三)
1.5 状态更新及事件回调 1.5.1 状态分析 1.5.2 事件回调分析 1.5.2 实现状态更新及事件回调 1.6 触摸优化 1.6.1 填充界面数据 1.6.2 主面板触摸优化 1.5 状态更新 ...
- iOS_仿QQ表情键盘
当UITextFiled和UITextView这种文本输入类控件成为第一响应者时,弹出的键盘由他们的一个UIView类的inputView属性来控制,当inputView为nil时会弹出系统的键盘,想 ...
- IM即时通讯项目讲解(一)--实现类似qq微信表情面板无缝切换
该系列技术课程来源慕课IM实战 带后台的IM即时通讯App 全程MVP手把手打造 通过该课程可以学习到以下知识点 1.了解和开发后台项目(这个是需要长期积累的,有了这个可以说入门没问题) 2.学习到I ...
最新文章
- AI 医疗公司“战疫”在前线
- Java必会的工具库,让你的代码量减少90%
- pandas基于日期信息(time or date)生成季度信息(quarter)实战:pandas基于日期信息列生成季度信息列、dt.quarter生成季度信息、dt.to_period生成季度信息
- k8s系列~mgr的应用
- 过河卒(Noip2002)
- c语言100个学生,输入100名学生的学号,姓名,性别,住址及10门功课,且显示每个学生10门课的最低和最高分,还要显示每门课不及格的学生人数,,还输入一个学号就能显示该学生的信息...
- ROS 机器人操作系统进阶实战
- E - Olympic Medal CodeForces - 215B(数学 思维)
- bob战队 rust_c、rust、golang、swift性能比较
- 想红想疯了?人民日报怒批女主播进教室摆拍:如此装束 成何体统
- exchange邮箱账号禁用之后 启用方法
- python2读文件,python之文件的读写(2)
- 图像处理之调整亮度与对比度
- 【区块链】——区块链与5G技术的结合
- js pug 代码_PUG 系列 | 第二课 JS 代码混合、包含引入
- 5分钟了解什么是OpenXR
- 58同城自动登录功能 分享给大家!
- po、bo、do、dto、vo相关图形
- 知云文献翻译打不开_沙拉查词—— 划线翻译的一股清流
- 【Redis】Redis数据库