300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 自定义控件--仿QQ表情面板

自定义控件--仿QQ表情面板

时间:2019-11-13 05:28:05

相关推荐

自定义控件--仿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();

下载地址: 点击打开链接

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。