Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 740|回复: 0

Android腾讯微博客户端开发四:微博发送篇(QQ表情,@搜索) -&nbs

[复制链接]

该用户从未签到

发表于 2011-10-25 08:53:16 | 显示全部楼层 |阅读模式
有一个问题,谁做过android的自定义表情啊?貌似还没有发现有客户端有,都是图片,如果能像在电脑上那样自定义表情的功能多好,那位大哥知道,麻烦告知一声,呵呵。写完,睡觉。


我们仔细来观察下腾讯微博的qq表情发送规律,由/开始,1到3个中文或者英文字符.


写个工具类来测试已测试正则表达式来匹配表情。





在上方输入框中可以输入查询 格式为 @你选择的列表值


这个是话题输入界面,格式为#话题#


表情选择页面,这个其实是一个每行5列的GridView



此界面可看到你写的微博的内容,点击发送,发送成功


哈哈,看到了吧,我的微博首页已经显示了我刚才发送的带有话题@person和表情的微博了。

接下来,上代码。
java代码

public class AddWeiboActivity extends Activity implements OnClickListener{

        

        private DataHelper dataHelper;

        private UserInfo user;

        private String user_default_name;

        private MyWeiboSync weibo;

        private ListView listView;

        private EditText weibo_content;

        private Button send_btn;

        private Button add_cmamera_btn;

        private Button add_at_btn;

        private Button add_topic_btn;

        private Button add_expression_btn;

        private Button add_location_btn;

        private GridView expressionGrid;

        private List<Map<String,Object>> expressionList;

        private ExpressionAdapter expressionAdapter;

        private FrameLayout operation_layout;

        private RelativeLayout add_top_bar;

        

        private ListView atListView;

        private RelativeLayout atRootLayout;

        private EditText atEditText;

        private Button atEnterBtn;

        private TextView topic_tip;

        

        private RelativeLayout.LayoutParams atEdiLayoutParams,atEnterBtnLayoutParams,atListViewLayoutParams,topicTipViewLayoutParams;

        

        private JSONArray array;

        private Handler handler;

        private ArrayAdapter atAdapter;

        private List<String> atList;

        private AtThread thread;

        private List<String> matchStrList;//选择atList匹配的字符串

        private int flag;

        private static int FLAG_1 = 1;

        private static int FLAG_2 = 2;//1和2代表atEnterBtn的父亲控件不同



        @Override

        protected void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);

                setContentView(R.layout.add_weibo);

               

                setUpViews();

                setUpListeners();

               

                dataHelper = DataBaseContext.getInstance(getApplicationContext());

                weibo = WeiboContext.getInstance();

               

                SharedPreferences preferences = getSharedPreferences("default_user",Activity.MODE_PRIVATE);

                user_default_name = preferences.getString("user_default_name", "");//取得微博默认登录账号信息

               

                handler = new AtHandler();

                thread = new AtThread();

                thread.start();//开启一个线程获取数据

        }

        

        private void setUpViews(){

                weibo_content = (EditText)findViewById(R.id.weibo_content);

                send_btn = (Button)findViewById(R.id.send_btn);

                add_cmamera_btn = (Button)findViewById(R.id.add_cmamera_btn);

                add_at_btn = (Button)findViewById(R.id.add_at_btn);

                add_topic_btn = (Button)findViewById(R.id.add_topic_btn);

                add_expression_btn = (Button)findViewById(R.id.add_expression_btn);

                add_location_btn = (Button)findViewById(R.id.add_location_btn);

               

                add_top_bar = (RelativeLayout)findViewById(R.id.add_top_bar);

                operation_layout = (FrameLayout)findViewById(R.id.operation_layout);

                expressionGrid = new GridView(this);

                expressionGrid.setNumColumns(5);

                expressionList = buildExpressionsList();

                expressionAdapter = new ExpressionAdapter(AddWeiboActivity.this, expressionList);

                expressionGrid.setAdapter(expressionAdapter);

               

                //以下代码至本方法setUpViews结束,是个人纯粹蛋疼联系纯代码布局,各位老大可以改成xml布局,淡定

               

                atRootLayout = new RelativeLayout(AddWeiboActivity.this);

               

                atEditText = new EditText(AddWeiboActivity.this);

                atEditText.setId(10000);

               

                atEnterBtn = new Button(AddWeiboActivity.this);

                atEnterBtn.setBackgroundDrawable(getResources().getDrawable(R.drawable.btn_enter_selector));

               

                atListView = new ListView(AddWeiboActivity.this);

                atListView.setCacheColorHint(Color.TRANSPARENT);//防止滑屏时出现黑快,不信可以注释掉此句试一试

                atListView.setDivider(getResources().getDrawable(R.drawable.list_divider));//设置分割线

                atListView.setBackgroundColor(Color.argb(255, 239, 239, 239));//alpha通道一定不要设置成透明的了,要不然textView什么也看不见,因为这个我找了很久,以为代码错了,最后才发现是透明的

               

                topic_tip = new TextView(AddWeiboActivity.this);

                topic_tip.setText("请输入话题");

                topic_tip.setTextSize(20);

                topic_tip.setTextColor(Color.argb(255, 90, 142, 189));//alpha通道一定不要设置成透明的了,要不然textView什么也看不见,因为这个我找了很久,以为代码错了,最后才发现是透明的

               

                atRootLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

                atEdiLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,80);

                atEnterBtnLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);

                atListViewLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);

                topicTipViewLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);

               

               

                //添加布局约束

                atEdiLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);

               

                atEnterBtnLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,RelativeLayout.TRUE);

                atEnterBtnLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,RelativeLayout.TRUE);

                atEnterBtnLayoutParams.setMargins(0, 10, 10, 0);//设置边距,分别代表左,上,右,下

               

                atListViewLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,RelativeLayout.TRUE);

                atListViewLayoutParams.addRule(RelativeLayout.BELOW, atEditText.getId());

               

                topicTipViewLayoutParams.addRule(RelativeLayout.BELOW, atEditText.getId());

               

        }

        

        private void setUpListeners(){

                send_btn.setOnClickListener(this);

                add_cmamera_btn.setOnClickListener(this);

                add_at_btn.setOnClickListener(this);

                add_topic_btn.setOnClickListener(this);

                add_expression_btn.setOnClickListener(this);

                add_location_btn.setOnClickListener(this);

                expressionGrid.setOnItemClickListener(new GridItemClickListener());

                atListView.setOnItemClickListener(new AtListViewItemListener());

                atEditText.addTextChangedListener(new MyTextWatcher());

                atEnterBtn.setOnClickListener(new OnClickListener() {

                        @Override

                        public void onClick(View v) {

                                add_top_bar.setVisibility(View.VISIBLE);

                                weibo_content.setVisibility(View.VISIBLE);

                                operation_layout.setVisibility(View.GONE);

                                operation_layout.removeAllViews();//别忘记要移除掉

                                if(flag==FLAG_1){

                                        weibo_content.setText(weibo_content.getText()+"@");

                                }else if(flag==FLAG_2){

                                        weibo_content.setText(weibo_content.getText()+"#"+atEditText.getText()+"#");

                                }

                                

                                

                        }

                });

        }

        

        class AtThread extends Thread {

                @Override

                public void run() {

                        String jsonStr = weibo.getFans(weibo.getAccessTokenKey(), weibo.getAccessTokenSecrect(), 20, 0, user_default_name);

                        try {

                                JSONObject dataObj = new JSONObject(jsonStr).getJSONObject("data");

                                array = dataObj.getJSONArray("info");

                        } catch (JSONException e) {

                                e.printStackTrace();

                        }

                        //通知handler处理数据

                        Message msg = handler.obtainMessage();

                        handler.sendMessage(msg);

                }

        }

        

        class AtHandler extends Handler {

                @Override

                public void handleMessage(Message msg){

                        int size = array.length();

                        atList = new ArrayList<String>();

                        for(int i = 0;i<size;i++){

                                JSONObject data = array.optJSONObject(i);

                                try {

                                        atList.add(data.getString("nick")+"("+data.getString("name")+")");

                                } catch (JSONException e) {

                                        e.printStackTrace();

                                }

                        }

                        matchStrList = new ArrayList<String>();

                        matchStrList.addAll(atList);

                        atAdapter = new ArrayAdapter<String>(AddWeiboActivity.this,R.layout.at_list_item,R.id.at_nick_name,atList);

                        atListView.setAdapter(atAdapter);

                }

        }

        

        class ExpressionAdapter extends BaseAdapter {

                private Context context;

                private LayoutInflater inflater;

                private List<Map<String,Object>> list;

               

                public ExpressionAdapter(Context context, List<Map<String,Object>> list) {

                        super();

                        this.context = context;

                        this.list = list;

                        this.inflater = LayoutInflater.from(context);

                }



                @Override

                public int getCount() {

                        return list.size();

                }



                @Override

                public Object getItem(int position) {

                        return list.get(position);

                }



                @Override

                public long getItemId(int position) {

                        return position;

                }



                @Override

                public View getView(final int position, View convertView, ViewGroup parent){

                        Map<String,Object> map = list.get(position);

                        ImageView image = new ImageView(context);

                        image.setImageDrawable((Drawable)map.get("drawable"));

                        return image;

                }

        }



        @Override

        public void onClick(View v) {

                if(operation_layout.getChildCount()>0){

                        add_top_bar.setVisibility(View.VISIBLE);

                        weibo_content.setVisibility(View.VISIBLE);

                        operation_layout.setVisibility(View.GONE);

                        operation_layout.removeAllViews();//别忘记要移除掉

                        return;

                }

                switch (v.getId()) {

               

                case R.id.send_btn:{

                        String returnStr = weibo.publishMsg(weibo.getAccessTokenKey(), weibo.getAccessTokenSecrect(), weibo_content.getText().toString());

                        try {

                                JSONObject dataObj = new JSONObject(returnStr);

                                if("ok".equals(dataObj.getString("msg"))){

                                        Toast.makeText(AddWeiboActivity.this, "发送成功", Toast.LENGTH_SHORT).show();//我日,记得要show,每次都搞忘记

                                }

                        } catch (JSONException e) {

                                e.printStackTrace();

                        }

                }

                        break;

                case R.id.add_cmamera_btn:{

                        

                }

                        break;

                case R.id.add_at_btn:{

                        // 动态的组装view

                        atRootLayout.removeAllViews();// 组装前先把所有的孩子拿掉

                        atEditText.setText("@");

                        flag = FLAG_1;//区分atEnterBtn是在哪个界面按的

                        atRootLayout.addView(atEditText, atEdiLayoutParams);

                        atRootLayout.addView(atEnterBtn, atEnterBtnLayoutParams);

                        atRootLayout.addView(atListView, atListViewLayoutParams);

                        operation_layout.addView(atRootLayout);



                        add_top_bar.setVisibility(View.GONE);// 隐藏上面的bar和文本编辑框,不让之与at选择相互影响

                        weibo_content.setVisibility(View.GONE);

                        operation_layout.setVisibility(View.VISIBLE);

                }

                        break;

                case R.id.add_topic_btn:{

                        //动态的组装view

                        atRootLayout.removeAllViews();//组装前先把所有的孩子拿掉

                        atEditText.setText("");

                        flag = FLAG_2;//区分atEnterBtn是在哪个界面按的

                        atRootLayout.addView(atEditText,atEdiLayoutParams);

                        atRootLayout.addView(atEnterBtn,atEnterBtnLayoutParams);

                        atRootLayout.addView(topic_tip,topicTipViewLayoutParams);

                        operation_layout.addView(atRootLayout);

                        

                        add_top_bar.setVisibility(View.GONE);// 隐藏上面的bar和文本编辑框,不让之与at选择相互影响

                        weibo_content.setVisibility(View.GONE);

                        operation_layout.setVisibility(View.VISIBLE);

                }

                        break;

                case R.id.add_expression_btn:{

                        add_top_bar.setVisibility(View.GONE);//隐藏上面的bar和文本编辑框,不让之与表情选择的gridView相互影响

                        weibo_content.setVisibility(View.GONE);

                        operation_layout.addView(expressionGrid);

                        operation_layout.setVisibility(View.VISIBLE);

                }

                        break;

                case R.id.add_location_btn:{

                        

                }

                        break;

                default:

                        break;

                }

        }

        private List<Map<String,Object>> buildExpressionsList(){

                List<Map<String,Object>> list = new ArrayList<Map<String, Object>>();

                DecimalFormat df = new DecimalFormat("000");//格式化数字

                for(int i = 0;i<105;i++){

                        Map<String,Object> map = new HashMap<String, Object>();

                        String formatStr = "h"+df.format(i);

                        int drawableId = 0 ;

                        try {

                                drawableId = R.drawable.class.getDeclaredField(formatStr).getInt(this);//反射取得id,这个地方循环套反射,是不是很耗性能啊,我没测试过,麻烦有好办法的兄弟姐妹分享一下

                        } catch (IllegalArgumentException e) {

                                e.printStackTrace();

                        } catch (SecurityException e) {

                                e.printStackTrace();

                        } catch (IllegalAccessException e) {

                                e.printStackTrace();

                        } catch (NoSuchFieldException e) {

                                e.printStackTrace();

                        }

                        Drawable drawable = getResources().getDrawable(drawableId);

                        map.put("drawableId", formatStr);

                        map.put("drawable",drawable);

                        list.add(map);

                }

                return list;

        }

        

        class GridItemClickListener implements OnItemClickListener {

                @Override

                public void onItemClick(AdapterView<?> adapterView, View view, int position,long arg3) {

                        Map<String, Object> map = expressionList.get(position);

                        String drawableId = (String)map.get("drawableId");

                        

                        add_top_bar.setVisibility(View.VISIBLE);

                        weibo_content.setVisibility(View.VISIBLE);

                        operation_layout.setVisibility(View.GONE);

                        operation_layout.removeAllViews();//别忘记要移除掉

                        

                        String expressionStr=null;

                        expressionStr = TextUtil.drawableIdToFaceName.get(drawableId);

                        expressionStr="/"+expressionStr;

                        weibo_content.setText(weibo_content.getText().toString()+expressionStr);

                }

        }

        

        class MyTextWatcher implements TextWatcher{

                @Override

                public void afterTextChanged(Editable s){

                        String changingStr = atEditText.getText().toString();

                        if(changingStr.indexOf("@")!=-1){

                                changingStr = changingStr.substring(1);

                        }

                        

                        int size = atList.size();

                        matchStrList.clear();

                        for(int i = 0;i<size;i++){

                                String currentStr = atList.get(i);

                                if(currentStr.indexOf(changingStr)!=-1){

                                        matchStrList.add(currentStr);

                                }

                        }

                        atAdapter = new ArrayAdapter<String>(AddWeiboActivity.this,R.layout.at_list_item,R.id.at_nick_name,matchStrList);

                        atAdapter.notifyDataSetChanged();

                        atListView.setAdapter(atAdapter);

                }



                @Override

                public void beforeTextChanged(CharSequence s, int start, int count,

                                int after) {

                        

                }



                @Override

                public void onTextChanged(CharSequence s, int start, int before,int count) {

                        

                }

        }

        

        class AtListViewItemListener implements OnItemClickListener{

                @Override

                public void onItemClick(AdapterView<?> arg0, View arg1, int position,long arg3){

                        add_top_bar.setVisibility(View.VISIBLE);

                        weibo_content.setVisibility(View.VISIBLE);

                        operation_layout.setVisibility(View.GONE);

                        operation_layout.removeAllViews();//别忘记要移除掉

                        

                        String str = matchStrList.get(position);

                        String nickStr = str.substring(0,str.indexOf("("));

                        weibo_content.setText(weibo_content.getText()+"@"+nickStr);

                }

        }

}
复制代码



add_weibo.xml:
Java代码

<?xml version="1.0" encoding="UTF-8"?>

<RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffffff" xmlns:android="http://schemas.android.com/apk/res/android">

   <RelativeLayout android:id="@+id/add_top_bar" android:background="@drawable/header" android:layout_width="fill_parent" android:layout_height="wrap_content">

            <Button android:text="发送" android:id="@+id/send_btn"  android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5.0dip" android:layout_alignParentRight="true"/>

            <TextView android:text="写广播" android:textSize="16.0sp" android:textColor="#ffffffff" android:ellipsize="middle" android:gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:layout_alignParentLeft="true" android:layout_marginLeft="10.0dip" android:layout_centerVertical="true"/>

        </RelativeLayout>

   <EditText android:id="@+id/weibo_content" android:gravity="top" android:layout_below="@id/add_top_bar" android:background="@null" android:textColor="@null" android:layout_weight="1" android:layout_width="fill_parent" android:layout_height="fill_parent"/>

   <RelativeLayout android:id="@+id/add_bottom_bar" android:background="@drawable/header" android:layout_width="fill_parent" android:layout_height="50.0dip" android:layout_alignParentBottom="true" android:layout_marginTop="5.0dip">

        <Button android:id="@+id/add_cmamera_btn" android:background="@drawable/add_pic_selector" android:focusable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="8.0dip" android:layout_marginRight="12.0dip" android:layout_alignParentLeft="true" android:layout_centerVertical="true" />

        <Button android:id="@+id/add_at_btn" android:background="@drawable/add_at_selector" android:focusable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="12.0dip" android:layout_toRightOf="@id/add_cmamera_btn" android:layout_centerVertical="true" />

        <Button android:id="@+id/add_topic_btn" android:background="@drawable/add_topic_selector" android:focusable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="12.0dip" android:layout_toRightOf="@id/add_at_btn" android:layout_centerVertical="true" />

        <Button android:id="@+id/add_expression_btn" android:background="@drawable/add_emo_selector" android:focusable="false" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="12.0dip" android:layout_toRightOf="@id/add_topic_btn" android:layout_centerVertical="true" />

        <Button android:id="@+id/add_location_btn" android:background="@drawable/add_location_selector" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/add_expression_btn" android:layout_centerVertical="true" />

        <TextView android:textSize="12.0sp" android:text="140" android:textColor="#c6cbce" android:id="@+id/remain_count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="12.0dip" android:layout_alignParentRight="true" android:layout_centerVertical="true" />

    </RelativeLayout>

    <FrameLayout android:layout_gravity="bottom" android:id="@+id/operation_layout" android:background="@android:color/transparent" android:paddingBottom="50.0dip" android:visibility="gone" android:layout_width="fill_parent" android:layout_height="fill_parent" />

</RelativeLayout>
复制代码



表情解析先关 :下图是drawable文件下的表情文件



Java代码
static{//表情文件和表情id的对应的HashMap<String,String>

                drawableIdToFaceName.put("h000","调皮");

                drawableIdToFaceName.put("h001","呲牙");

                drawableIdToFaceName.put("h002","惊讶");

                drawableIdToFaceName.put("h003","难过");

                drawableIdToFaceName.put("h004","酷");

                drawableIdToFaceName.put("h005","冷汗");

                drawableIdToFaceName.put("h006","抓狂");
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 14:10 , Processed in 0.387685 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表