├── .gitignore ├── .idea ├── .name ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── king │ │ └── chatview │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── king │ │ │ └── chatview │ │ │ ├── MainActivity.java │ │ │ ├── app │ │ │ └── App.java │ │ │ ├── fragment │ │ │ └── BaseFragment.java │ │ │ ├── layout │ │ │ └── KeyboardDetectorRelativeLayout.java │ │ │ ├── tools │ │ │ ├── DImenUtil.java │ │ │ └── DeviceUtil.java │ │ │ ├── utils │ │ │ ├── BundleArguments.java │ │ │ ├── ContextHolder.java │ │ │ └── ResourceUtil.java │ │ │ └── widgets │ │ │ ├── ChatToolBox.java │ │ │ ├── CustomIndicator.java │ │ │ ├── InputChat.java │ │ │ ├── OnlyView.java │ │ │ ├── VoicePress.java │ │ │ └── emotion │ │ │ ├── EmotionView.java │ │ │ ├── adapter │ │ │ ├── BaseEmotionAdapter.java │ │ │ ├── CustomEmotionAdapter.java │ │ │ └── EmotionAdapter.java │ │ │ ├── data │ │ │ ├── CustomEmoji.java │ │ │ ├── Emoji.java │ │ │ ├── Emoticon.java │ │ │ ├── EmotionData.java │ │ │ └── UniqueEmoji.java │ │ │ └── item │ │ │ └── StickerItem.java │ └── res │ │ ├── drawable-hdpi │ │ ├── avos_plusbox.png │ │ ├── avos_plusbox_press.png │ │ ├── icon_indicator_0.png │ │ └── icon_indicator_1.png │ │ ├── drawable-xhdpi │ │ ├── u1f004.png │ │ ├── u1f30f.png │ │ ├── u1f319.png │ │ ├── u1f332.png │ │ ├── u1f339.png │ │ ├── u1f33b.png │ │ ├── u1f349.png │ │ ├── u1f356.png │ │ ├── u1f35a.png │ │ ├── u1f366.png │ │ ├── u1f36b.png │ │ ├── u1f377.png │ │ ├── u1f37b.png │ │ ├── u1f381.png │ │ ├── u1f382.png │ │ ├── u1f384.png │ │ ├── u1f389.png │ │ ├── u1f393.png │ │ ├── u1f3a4.png │ │ ├── u1f3b2.png │ │ ├── u1f3b5.png │ │ ├── u1f3c0.png │ │ ├── u1f3c2.png │ │ ├── u1f3e1.png │ │ ├── u1f434.png │ │ ├── u1f436.png │ │ ├── u1f437.png │ │ ├── u1f44a.png │ │ ├── u1f44c.png │ │ ├── u1f44d.png │ │ ├── u1f44e.png │ │ ├── u1f44f.png │ │ ├── u1f451.png │ │ ├── u1f46a.png │ │ ├── u1f46b.png │ │ ├── u1f47b.png │ │ ├── u1f47c.png │ │ ├── u1f47d.png │ │ ├── u1f47f.png │ │ ├── u1f484.png │ │ ├── u1f48a.png │ │ ├── u1f48b.png │ │ ├── u1f48d.png │ │ ├── u1f494.png │ │ ├── u1f4a1.png │ │ ├── u1f4a2.png │ │ ├── u1f4a3.png │ │ ├── u1f4a4.png │ │ ├── u1f4a9.png │ │ ├── u1f4aa.png │ │ ├── u1f4b0.png │ │ ├── u1f4da.png │ │ ├── u1f4de.png │ │ ├── u1f4e2.png │ │ ├── u1f525.png │ │ ├── u1f52b.png │ │ ├── u1f556.png │ │ ├── u1f600.png │ │ ├── u1f601.png │ │ ├── u1f602.png │ │ ├── u1f603.png │ │ ├── u1f605.png │ │ ├── u1f606.png │ │ ├── u1f607.png │ │ ├── u1f608.png │ │ ├── u1f609.png │ │ ├── u1f60a.png │ │ ├── u1f60b.png │ │ ├── u1f60c.png │ │ ├── u1f60d.png │ │ ├── u1f60e.png │ │ ├── u1f60f.png │ │ ├── u1f611.png │ │ ├── u1f612.png │ │ ├── u1f613.png │ │ ├── u1f614.png │ │ ├── u1f615.png │ │ ├── u1f616.png │ │ ├── u1f618.png │ │ ├── u1f61a.png │ │ ├── u1f61c.png │ │ ├── u1f61d.png │ │ ├── u1f61e.png │ │ ├── u1f61f.png │ │ ├── u1f621.png │ │ ├── u1f622.png │ │ ├── u1f623.png │ │ ├── u1f624.png │ │ ├── u1f628.png │ │ ├── u1f629.png │ │ ├── u1f62a.png │ │ ├── u1f62b.png │ │ ├── u1f62c.png │ │ ├── u1f62d.png │ │ ├── u1f62e.png │ │ ├── u1f62f.png │ │ ├── u1f630.png │ │ ├── u1f631.png │ │ ├── u1f632.png │ │ ├── u1f633.png │ │ ├── u1f634.png │ │ ├── u1f635.png │ │ ├── u1f636.png │ │ ├── u1f637.png │ │ ├── u1f648.png │ │ ├── u1f649.png │ │ ├── u1f64a.png │ │ ├── u1f64f.png │ │ ├── u1f680.png │ │ ├── u1f6ab.png │ │ ├── u1f6b2.png │ │ ├── u1f6bf.png │ │ ├── u23f0.png │ │ ├── u23f3.png │ │ ├── u2600.png │ │ ├── u2601.png │ │ ├── u2614.png │ │ ├── u2615.png │ │ ├── u261d.png │ │ ├── u263a.png │ │ ├── u26a1.png │ │ ├── u26bd.png │ │ ├── u26c4.png │ │ ├── u26c5.png │ │ ├── u270a.png │ │ ├── u270b.png │ │ ├── u270c.png │ │ ├── u270f.png │ │ ├── u2744.png │ │ └── u2b50.png │ │ ├── drawable-xxhdpi │ │ ├── amp1.png │ │ ├── amp2.png │ │ ├── amp3.png │ │ ├── amp4.png │ │ ├── amp5.png │ │ ├── amp6.png │ │ ├── amp7.png │ │ ├── app_panel_ads_normal.png │ │ ├── app_panel_ads_pressed.png │ │ ├── app_panel_gallery_normal.png │ │ ├── app_panel_gallery_pressed.png │ │ ├── app_panel_location_normal.png │ │ ├── app_panel_location_pressed.png │ │ ├── app_panel_video_normal.png │ │ ├── app_panel_video_pressed.png │ │ ├── bx_emotion_delete.png │ │ ├── chatting_setmode_keyboard_btn_normal.png │ │ ├── chatting_setmode_keyboard_btn_pressed.png │ │ ├── chatting_setmode_voice_btn_normal.png │ │ ├── chatting_setmode_voice_btn_pressed.png │ │ ├── emoji_select_btn_normal.png │ │ ├── emoji_select_btn_pressed.png │ │ ├── rcd_cancel_icon.png │ │ ├── type_select_btn_normal.png │ │ ├── type_select_btn_pressed.png │ │ └── voice_rcd_hint.png │ │ ├── drawable │ │ ├── app_panel_ads_selector.xml │ │ ├── app_panel_gallery_selector.xml │ │ ├── app_panel_location_selector.xml │ │ ├── app_panel_video_selector.xml │ │ ├── bg_toolbox.xml │ │ ├── btn_call.xml │ │ ├── btn_call_disable.xml │ │ ├── btn_call_on.xml │ │ ├── chat_editbox_background.xml │ │ ├── chat_send_btn.xml │ │ ├── chatting_setmode_keyboard_btn_selector.xml │ │ ├── chatting_setmode_voice_btn_selector.xml │ │ ├── emoji_select_btn_selector.xml │ │ ├── post_finish_btn.xml │ │ ├── reddot.xml │ │ ├── sticker_btn_normal.xml │ │ ├── sticker_btn_selected.xml │ │ ├── sticker_style.xml │ │ ├── talk_btn_bg.xml │ │ ├── talk_btn_bg_press.xml │ │ └── type_select_btn_selector.xml │ │ ├── layout │ │ ├── activity_main.xml │ │ ├── avos_input_voice.xml │ │ ├── avos_voice_cancel.xml │ │ ├── bx_emotion.xml │ │ ├── chat_view.xml │ │ ├── chat_view_new.xml │ │ ├── emotion_view.xml │ │ ├── inputchat.xml │ │ ├── inputchat_new.xml │ │ ├── item_tool_box.xml │ │ └── voice_press.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── emotion_arrays.xml │ │ ├── ids.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── king │ └── chatview │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── release.sh └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /local.properties 3 | /.idea/workspace.xml 4 | /.idea/libraries 5 | .DS_Store 6 | /build 7 | /captures 8 | 9 | 10 | 11 | # built application files 12 | *.apk 13 | *.ap_ 14 | 15 | # files for the dex VM 16 | *.dex 17 | 18 | # Java class files 19 | *.class 20 | 21 | # generated files 22 | bin/ 23 | gen/ 24 | 25 | # Local configuration file (sdk path, etc) 26 | local.properties 27 | #project.properties 28 | 29 | # Eclipse project files 30 | .classpath 31 | .project 32 | .metadata/ 33 | 34 | # IDEA project files 35 | .idea/ 36 | *.eml 37 | *.iml 38 | atlassian-ide-plugin.xml 39 | 40 | proguard/ 41 | .settings/ -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | ChatView -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | 47 | 48 | 49 | 50 | 1.7 51 | 52 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AndroidEmotionView 2 | 仿照微信的输入框表情view(从 百姓网 android 端 剥离出来并重构) 3 | 4 | 对外的接口从 InputChat 类的 onInitializeView 开始 5 | 6 | 在外层通过继承 Emoticon 定义好表情元素并根据这些表情元素组合成EmotionData,再把多个EmotionData 组合成 List 后方可传入 EmotionView 7 | 8 | 在设置好EmotionDataList后可以设置Listener监听事件 9 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "23.0.2" 6 | 7 | defaultConfig { 8 | applicationId "com.king.chatview" 9 | minSdkVersion 15 10 | targetSdkVersion 23 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | testCompile 'junit:junit:4.12' 25 | compile 'com.android.support:appcompat-v7:23.1.0' 26 | compile 'com.github.bumptech.glide:glide:3.6.1' 27 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\Android\adt-bundle-windows-x86_64-20140702\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/king/chatview/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview; 2 | 3 | import android.app.AlertDialog; 4 | import android.content.DialogInterface; 5 | import android.content.Intent; 6 | import android.net.Uri; 7 | import android.support.v7.app.AppCompatActivity; 8 | import android.os.Bundle; 9 | import android.util.Log; 10 | 11 | import com.king.chatview.layout.KeyboardDetectorRelativeLayout; 12 | import com.king.chatview.widgets.ChatToolBox; 13 | import com.king.chatview.widgets.InputChat; 14 | 15 | public class MainActivity extends AppCompatActivity { 16 | private static final String INPUT_CHAT_TAG = "input_chat"; 17 | InputChat inputChat; 18 | 19 | @Override 20 | protected void onCreate(Bundle savedInstanceState) { 21 | super.onCreate(savedInstanceState); 22 | setContentView(R.layout.chat_view_new); 23 | inputChat = new InputChat(); 24 | 25 | inputChat.addToolBoxData(new ToolAd()); 26 | 27 | getSupportFragmentManager().beginTransaction().replace(R.id.input_container, inputChat, INPUT_CHAT_TAG).commit(); 28 | inputChat.setInputChatListener(new InputChat.InputChatListener() { 29 | @Override 30 | public void onSendMessage(String msg) { 31 | Log.d("hehe", "sendMessage:" + msg); 32 | } 33 | 34 | @Override 35 | public void onSendVoiceMessage(String path, int duration, String description) { 36 | Log.d("hehe", "SendVoiceMessage:" + "path:" + path + " duration:" + duration + " description:" + description); 37 | } 38 | 39 | @Override 40 | public void onPickPhotoMessage(Intent data) { 41 | Log.d("hehe", "PickPhotoMessage:" + data.toString()); 42 | } 43 | 44 | @Override 45 | public void onTakePhotoMessage(Intent data) { 46 | Log.d("hehe", "TakePhotoMessage:" + data.toString()); 47 | } 48 | 49 | @Override 50 | public void onPickLocMessage(Intent data) { 51 | Log.d("hehe", "PickLocMessage:" + data.toString()); 52 | } 53 | }); 54 | 55 | KeyboardDetectorRelativeLayout root = (KeyboardDetectorRelativeLayout) findViewById(R.id.chat_root); 56 | root.setOnSoftKeyboardListener(new KeyboardDetectorRelativeLayout.OnSoftKeyboardListener() { 57 | @Override 58 | public void onShown(int keyboardHeight) { 59 | inputChat.onKeyboardShow(keyboardHeight); 60 | } 61 | 62 | @Override 63 | public void onHidden() { 64 | inputChat.onKeyboardDismiss(); 65 | } 66 | 67 | @Override 68 | public void onMeasureFinished() { 69 | // if (inputChat.isBoxShow()) { 70 | // } else { 71 | // } 72 | } 73 | }); 74 | } 75 | 76 | private class ToolAd implements ChatToolBox.ChatToolItem { 77 | @Override 78 | public int getIcon() { 79 | return R.drawable.app_panel_ads_selector; 80 | } 81 | 82 | @Override 83 | public String getName() { 84 | return "信息"; 85 | } 86 | 87 | @Override 88 | public void onItemSelected() { 89 | AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this) 90 | .setTitle("请选择") 91 | .setItems(new String[]{"已发布信息", "收藏"}, new DialogInterface.OnClickListener() { 92 | @Override 93 | public void onClick(DialogInterface dialog, int which) { 94 | dialog.dismiss(); 95 | } 96 | }); 97 | builder.create().show(); 98 | } 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/app/App.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.app; 2 | 3 | import android.app.Application; 4 | 5 | import com.king.chatview.utils.ContextHolder; 6 | 7 | /** 8 | * Created by Administrator on 2015/11/10. 9 | */ 10 | public class App extends Application{ 11 | @Override 12 | public void onCreate() { 13 | super.onCreate(); 14 | ContextHolder.getInstance().init(this); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/fragment/BaseFragment.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.fragment; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.support.v4.app.Fragment; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.view.inputmethod.InputMethodManager; 10 | 11 | import com.king.chatview.utils.ContextHolder; 12 | 13 | /** 14 | * Created by Administrator on 2015/11/10. 15 | */ 16 | public abstract class BaseFragment extends Fragment{ 17 | protected abstract View onInitializeView(LayoutInflater inflater, ViewGroup container, 18 | Bundle savedInstanceState); 19 | 20 | @Override 21 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 22 | return onInitializeView(inflater, container, savedInstanceState); 23 | } 24 | 25 | protected final Context getAppContext() { 26 | return ContextHolder.getInstance().get(); 27 | } 28 | 29 | protected void hideSoftKeyboard() 30 | { 31 | final View currentRoot = getView(); 32 | if (currentRoot != null) 33 | { 34 | final InputMethodManager mgr = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 35 | currentRoot.postDelayed(new Runnable() { 36 | public void run() { 37 | mgr.hideSoftInputFromWindow(currentRoot.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 38 | } 39 | }, 100); 40 | } 41 | } 42 | 43 | protected void handleLeftAction() { 44 | if(false == handleBack()) { 45 | // finishActivity(); 46 | } 47 | } 48 | 49 | public boolean handleBack() 50 | { 51 | return false; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/layout/KeyboardDetectorRelativeLayout.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.layout; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.util.Log; 6 | import android.widget.RelativeLayout; 7 | 8 | /** 9 | * Created by Administrator on 2015/11/10. 10 | */ 11 | public class KeyboardDetectorRelativeLayout extends RelativeLayout { 12 | private OnSoftKeyboardListener listener; 13 | 14 | public KeyboardDetectorRelativeLayout(Context context) { 15 | this(context, null); 16 | } 17 | 18 | public KeyboardDetectorRelativeLayout(Context context, AttributeSet attrs) { 19 | this(context, attrs, 0); 20 | } 21 | 22 | public KeyboardDetectorRelativeLayout(Context context, AttributeSet attrs, int defStyle) { 23 | super(context, attrs, defStyle); 24 | } 25 | 26 | @Override 27 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 28 | final int proposedheight = MeasureSpec.getSize(heightMeasureSpec); 29 | final int actualHeight = getHeight(); 30 | 31 | int diff = actualHeight - proposedheight; 32 | Log.d("hehe", "diff:"+diff); 33 | if (diff > 100) { 34 | if (null != listener) { 35 | listener.onShown(diff); 36 | } 37 | 38 | } else if (diff < -100) { 39 | if (null != listener) { 40 | listener.onHidden(); 41 | } 42 | } 43 | super.onMeasure(widthMeasureSpec, heightMeasureSpec); 44 | 45 | if (null != listener) { 46 | listener.onMeasureFinished(); 47 | } 48 | } 49 | 50 | public void setOnSoftKeyboardListener(OnSoftKeyboardListener listener) { 51 | this.listener = listener; 52 | } 53 | 54 | public interface OnSoftKeyboardListener { 55 | void onShown(int keyboardHeight); 56 | 57 | void onHidden(); 58 | 59 | void onMeasureFinished(); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/tools/DImenUtil.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.tools; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * Created by Administrator on 2015/11/10. 7 | */ 8 | public class DImenUtil { 9 | /** 10 | * 根据手机的分辨率从 dp 的单位 转成为 px(像素) 11 | */ 12 | public static int dip2px(Context context, float dpValue) { 13 | final float scale = context.getResources().getDisplayMetrics().density; 14 | return (int) (dpValue * scale + 0.5f); 15 | } 16 | 17 | /** 18 | * 根据手机的分辨率从 px(像素) 的单位 转成为 dp 19 | */ 20 | public static int px2dip(Context context, float pxValue) { 21 | final float scale = context.getResources().getDisplayMetrics().density; 22 | return (int) (pxValue / scale + 0.5f); 23 | } 24 | 25 | public static int px2sp(Context context, float px) { 26 | float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity; 27 | return (int) (px/scaledDensity + 0.5f); 28 | } 29 | 30 | public static float sp2px(Context context, float sp) { 31 | float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity; 32 | return (float)((sp-0.5) * scaledDensity); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/tools/DeviceUtil.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.tools; 2 | 3 | import android.content.Context; 4 | import android.content.SharedPreferences; 5 | import android.os.Environment; 6 | import android.provider.Settings; 7 | import android.telephony.TelephonyManager; 8 | import android.view.WindowManager; 9 | 10 | import java.util.UUID; 11 | 12 | /** 13 | * Created by Administrator on 2015/11/10. 14 | */ 15 | public class DeviceUtil { 16 | public static String getDevicePhoneNumber(Context ctx){ 17 | TelephonyManager mTelephonyMgr = (TelephonyManager)ctx.getSystemService(Context.TELEPHONY_SERVICE); 18 | String number = null; 19 | if(mTelephonyMgr != null){ 20 | number = mTelephonyMgr.getLine1Number(); 21 | if(number != null && number.length() >= 11){ 22 | number = number.substring(number.length() - 11); 23 | } 24 | } 25 | return number; 26 | } 27 | 28 | private static String PREF_DEVICE_ID = "bx_share_deviceID"; 29 | private static String PREF_KEY_DEVICE_ID = "pref_key_device"; 30 | private static String DEVICE_ID = ""; 31 | 32 | static public String getDeviceUdid(Context context) { 33 | 34 | /** 35 | * Firstly, check if memory exists. 36 | */ 37 | if (DEVICE_ID != null && DEVICE_ID.length() > 0) 38 | { 39 | return DEVICE_ID; 40 | } 41 | 42 | /** 43 | * Then, check if we have saved the preference. 44 | */ 45 | SharedPreferences pref = context.getSharedPreferences(PREF_DEVICE_ID, Context.MODE_PRIVATE); 46 | if (pref != null && pref.contains(PREF_KEY_DEVICE_ID)) 47 | { 48 | DEVICE_ID = pref.getString(PREF_KEY_DEVICE_ID, null); 49 | } 50 | 51 | if (DEVICE_ID != null && DEVICE_ID.length() > 0) 52 | { 53 | return DEVICE_ID; 54 | } 55 | 56 | /** 57 | * And last, get ANDROID_ID or device id, or random id if we cannot get any unique id from android system. 58 | */ 59 | try 60 | { 61 | DEVICE_ID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); 62 | 63 | /** 64 | * --> 9774d56d682e549c is an android system bug. 65 | * --> null or "null" means cannot get android id. 66 | */ 67 | if ("9774d56d682e549c".equals(DEVICE_ID) || DEVICE_ID == null || "null".equalsIgnoreCase(DEVICE_ID.trim())) { 68 | final String deviceId = ((TelephonyManager) context.getSystemService( Context.TELEPHONY_SERVICE )).getDeviceId(); 69 | String uuid = deviceId!=null && !"null".equalsIgnoreCase(deviceId.trim()) ? UUID.nameUUIDFromBytes(deviceId.getBytes("utf8")).toString() : UUID.randomUUID().toString(); 70 | 71 | DEVICE_ID = uuid; 72 | return uuid; 73 | } 74 | } 75 | catch(Throwable t) 76 | { 77 | DEVICE_ID = System.currentTimeMillis() + ""; //If any exception occur, use system current time as unique id. 78 | t.printStackTrace(); 79 | } 80 | finally 81 | { 82 | if (pref != null) 83 | { 84 | pref.edit().putString(PREF_KEY_DEVICE_ID, DEVICE_ID).commit(); 85 | } 86 | } 87 | 88 | return DEVICE_ID; 89 | 90 | } 91 | 92 | public static int getWidthByContext(Context context){ 93 | try { 94 | WindowManager winManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); 95 | return winManager.getDefaultDisplay().getWidth(); 96 | } 97 | catch(Exception e) { 98 | e.printStackTrace(); 99 | } 100 | return 0; 101 | } 102 | 103 | public static int getHeightByContext(Context context){ 104 | try { 105 | WindowManager winManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); 106 | return winManager.getDefaultDisplay().getHeight(); 107 | } 108 | catch(Exception e) { 109 | e.printStackTrace(); 110 | } 111 | return 0; 112 | } 113 | 114 | 115 | public static boolean isExternalStorageWriteable() { 116 | String state = Environment.getExternalStorageState(); 117 | 118 | return Environment.MEDIA_MOUNTED.equals(state); 119 | } 120 | 121 | public static boolean isExternalStorageReadable() { 122 | String state = Environment.getExternalStorageState(); 123 | 124 | return Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state); 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/utils/BundleArguments.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.utils; 2 | 3 | /** 4 | * Created by Administrator on 2015/11/10. 5 | */ 6 | public class BundleArguments { 7 | public static final String ARG_AD = "ad"; 8 | public static final String ARG_IS_EDIT = "isEdit"; 9 | public static final String ARG_COUNT = "count"; 10 | public static final String ARG_USER_BUNDLE_INFO = "user_bundle_info"; 11 | public static final String ARG_USER_CREATE_TIME = "user_create_time"; 12 | public static final String NEED_PHOTO_UPLOAD = "need_photo_upload"; 13 | 14 | public static final String ARGS_LOGIN_DEFAULT_NUMBER = "defaultNumber"; 15 | public static final String MSG_AUTO_LOGIN_CLICKED = "MSG_AUTO_LOGIN_CLICKED"; 16 | 17 | public static final String ARG_SHARE_AD = "sharedAd"; 18 | 19 | public static final String ARG_USER_ID = "user_id"; 20 | public static final String ARG_USER_IMAGE = "user_image"; 21 | public static final String ARG_USER_NICK = "user_nick"; 22 | 23 | public static final String MAP_LON = "map.longitude"; 24 | public static final String MAP_LAT = "map.latitude"; 25 | public static final String MAP_ADDRESS = "map.address"; 26 | 27 | public final static String TYPE_KEY_AD_FRAGMENT = "PersonalPostFragment_type_key"; 28 | public final static String BIG_GALLERY_PHOTO_SELECT = "selected_index"; 29 | public final static String BIG_GALLERY_URIS = "uris"; 30 | 31 | public final static String GUIDE_RES = "res"; 32 | 33 | public static final String RESULT = "result"; 34 | 35 | public final static String ARG_IS_MY_RESUME = "isMyResume"; 36 | public final static String ARG_RESUME = "resume"; 37 | public final static String ARG_RESUME_ID = "resume_id"; 38 | public static final String RESUME_CREATE_AND_SEND = "create2send"; 39 | public static final String RESUME_ARG_EDITMODE = "edit_mode"; 40 | public static final String ARG_IS_MODIFY = "isModify"; 41 | public static final String ARG_INDEX = "index"; 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/utils/ContextHolder.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.utils; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * Created by Administrator on 2015/11/10. 7 | */ 8 | public class ContextHolder { 9 | private static ContextHolder ourInstance = new ContextHolder(); 10 | 11 | public static ContextHolder getInstance() { 12 | return ourInstance; 13 | } 14 | 15 | Context context; 16 | 17 | private ContextHolder() {} 18 | 19 | public void init(Context context) { 20 | this.context = context; 21 | } 22 | 23 | public Context get() { 24 | return context; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/utils/ResourceUtil.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.utils; 2 | 3 | import android.content.ContentResolver; 4 | import android.content.Context; 5 | 6 | /** 7 | * Created by Administrator on 2015/11/14. 8 | */ 9 | public class ResourceUtil { 10 | public static String getResourceUriString(Context context, int resource) { 11 | return ContentResolver.SCHEME_ANDROID_RESOURCE + "://" 12 | + context.getResources().getResourcePackageName(resource) + "/" 13 | + context.getResources().getResourceTypeName(resource) + "/" 14 | + context.getResources().getResourceEntryName(resource); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/widgets/ChatToolBox.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.widgets; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.AdapterView; 8 | import android.widget.BaseAdapter; 9 | import android.widget.GridView; 10 | import android.widget.ImageView; 11 | import android.widget.TextView; 12 | 13 | import com.king.chatview.R; 14 | import com.king.chatview.tools.DImenUtil; 15 | import com.king.chatview.tools.DeviceUtil; 16 | 17 | import java.util.List; 18 | 19 | public class ChatToolBox extends GridView { 20 | 21 | private ChatToolBoxAdapter adapter; 22 | 23 | private static final int GRID_ITEM_WIDTH = 80; 24 | private static final int IMAGE_SIZE_DIP = 60; 25 | //private static final int COMMON_MARGIN = 10; 26 | 27 | public ChatToolBox(Context context) { 28 | this(context, null); 29 | } 30 | 31 | public ChatToolBox(Context context, AttributeSet attrs) { 32 | this(context, attrs, 0); 33 | } 34 | 35 | public ChatToolBox(Context context, AttributeSet attrs, int defStyle) { 36 | super(context, attrs, defStyle); 37 | init(); 38 | } 39 | 40 | private void init() { 41 | adapter = new ChatToolBoxAdapter(this.getContext()); 42 | this.setAdapter(adapter); 43 | this.setOnItemClickListener(new OnItemClickListener() { 44 | @Override 45 | public void onItemClick(AdapterView parent, View view, 46 | int position, long id) { 47 | ChatToolItem item = ((ChatToolBoxAdapter)parent.getAdapter()).getItem(position); 48 | if(null != item) { 49 | item.onItemSelected(); 50 | } 51 | } 52 | }); 53 | this.setSelector(R.color.transparent); 54 | 55 | int screenWidth = DeviceUtil.getWidthByContext(this.getContext()); 56 | int itemWidth = DImenUtil.dip2px(this.getContext(), GRID_ITEM_WIDTH); 57 | int imageSize = DImenUtil.dip2px(this.getContext(), IMAGE_SIZE_DIP); 58 | int numColums = screenWidth / itemWidth; 59 | 60 | int padding = (screenWidth - numColums * imageSize) / (2 * numColums + 2); 61 | 62 | //this.setPadding(padding, padding * 2, padding, 0); 63 | 64 | this.setNumColumns(numColums); 65 | this.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); 66 | //this.setColumnWidth(itemWidth); 67 | //this.setVerticalSpacing(padding * 2); 68 | } 69 | 70 | public void setData(List items) { 71 | adapter.setData(items); 72 | adapter.notifyDataSetChanged(); 73 | } 74 | 75 | public static interface ChatToolItem { 76 | public int getIcon(); 77 | public String getName(); 78 | public void onItemSelected(); 79 | } 80 | 81 | private static class ChatToolBoxAdapter extends BaseAdapter { 82 | Context context; 83 | List items; 84 | 85 | public ChatToolBoxAdapter(Context context) { 86 | this.context = context; 87 | } 88 | 89 | public void setData(List items) { 90 | this.items = items; 91 | } 92 | 93 | @Override 94 | public int getCount() { 95 | if(null != items) { 96 | return items.size(); 97 | } 98 | return 0; 99 | } 100 | 101 | @Override 102 | public ChatToolItem getItem(int position) { 103 | if(null != items) { 104 | return items.get(position); 105 | } 106 | return null; 107 | } 108 | 109 | @Override 110 | public long getItemId(int position) { 111 | return position; 112 | } 113 | 114 | @Override 115 | public View getView(int position, View convertView, ViewGroup parent) { 116 | //LayoutInflater inflater 117 | if(null == convertView) { 118 | convertView = inflate(context, R.layout.item_tool_box, null); 119 | ViewHolder holder = new ViewHolder(); 120 | holder.txt = (TextView) convertView.findViewById(R.id.tool_text); 121 | holder.img = (ImageView) convertView.findViewById(R.id.tool_img); 122 | /*LinearLayout container = new LinearLayout(context); 123 | container.setOrientation(LinearLayout.VERTICAL); 124 | container.setGravity(Gravity.CENTER); 125 | ViewHolder holder = new ViewHolder(); 126 | holder.txt = new TextView(context); 127 | holder.img = new ImageView(context); 128 | 129 | int imageSize = DImenUtil.dip2px(context, IMAGE_SIZE_DIP); 130 | int margin = DImenUtil.dip2px(context, COMMON_MARGIN); 131 | LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(imageSize, imageSize); 132 | params.setMargins(margin, 0, margin, margin/2); 133 | holder.img.setLayoutParams(params); 134 | 135 | holder.txt.setTextColor(Color.DKGRAY); 136 | holder.txt.setGravity(Gravity.CENTER_HORIZONTAL); 137 | 138 | container.addView(holder.img); 139 | container.addView(holder.txt);*/ 140 | convertView.setTag(holder); 141 | //convertView = container; 142 | } 143 | 144 | ViewHolder holder = (ViewHolder)convertView.getTag(); 145 | ChatToolItem item = this.getItem(position); 146 | if(null == holder || null == item) { 147 | return convertView; 148 | } 149 | 150 | holder.img.setBackgroundResource(item.getIcon()); 151 | holder.txt.setText(item.getName()); 152 | return convertView; 153 | } 154 | 155 | static class ViewHolder { 156 | TextView txt; 157 | ImageView img; 158 | } 159 | } 160 | } 161 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/widgets/CustomIndicator.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.widgets; 2 | 3 | /** 4 | * Created by yqd on 14/11/20. 5 | */ 6 | 7 | import android.content.Context; 8 | import android.util.AttributeSet; 9 | import android.widget.ImageView; 10 | import android.widget.LinearLayout; 11 | import android.widget.RelativeLayout; 12 | 13 | import com.king.chatview.R; 14 | 15 | import java.util.ArrayList; 16 | import java.util.List; 17 | 18 | public class CustomIndicator extends LinearLayout { 19 | 20 | private Context mContext; 21 | private int width; 22 | private int height; 23 | private int margin; 24 | private int normalId, selectedId; 25 | private int count = 0; 26 | private int currentCount = 0; 27 | private List views = new ArrayList(); 28 | 29 | public CustomIndicator(Context context) { 30 | this(context, null); 31 | } 32 | 33 | public CustomIndicator(Context context, AttributeSet attrs) { 34 | super(context, attrs); 35 | mContext = context; 36 | initParams(); 37 | } 38 | 39 | public void setDotMargin(int margin){ 40 | this.margin = margin; 41 | } 42 | public void setDotWidth(int width){ 43 | this.width = width; 44 | } 45 | public void setDotHeight(int height){ 46 | this.height = height; 47 | } 48 | public void setDotCount(int count){ 49 | this.count = count; 50 | } 51 | public void setNormalId(int id){ 52 | this.normalId = id; 53 | } 54 | public void setSelectedId(int id){ 55 | this.selectedId = id; 56 | } 57 | 58 | public void setCurrentPosition(int pos) { 59 | if (count == 0){ 60 | return; 61 | } 62 | pos = pos % count; 63 | if(pos < 0) { 64 | pos += count; 65 | } 66 | if(null != views && views.size() > currentCount) { 67 | views.get(currentCount).setBackgroundResource(normalId); 68 | currentCount = pos; 69 | views.get(currentCount).setBackgroundResource(selectedId); 70 | } 71 | } 72 | 73 | public void next() { 74 | setCurrentPosition(currentCount + 1); 75 | } 76 | 77 | public void previous() { 78 | setCurrentPosition(currentCount-1); 79 | } 80 | 81 | private void initParams(){ 82 | margin = 10; 83 | width = 40; 84 | height = 40; 85 | count = 0; 86 | normalId = R.drawable.icon_indicator_0; 87 | selectedId = R.drawable.reddot; 88 | } 89 | public void show(){ 90 | initViews(); 91 | } 92 | private void initViews() { 93 | views.clear(); 94 | this.removeAllViews(); 95 | for(int i = 0; i < count; i++) { 96 | ImageView view = new ImageView(mContext); 97 | views.add(view); 98 | LayoutParams params = new LayoutParams(width == 0 ? LayoutParams.WRAP_CONTENT : width, 99 | height == 0 ? LayoutParams.WRAP_CONTENT : height); 100 | if(i != count-1) { 101 | params.rightMargin = margin; 102 | } 103 | view.setLayoutParams(params); 104 | view.setBackgroundResource(normalId); 105 | this.addView(view); 106 | } 107 | setCurrentPosition(0); 108 | } 109 | 110 | public void removeMargins() { 111 | RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)getLayoutParams(); 112 | params.topMargin = 0; 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/widgets/OnlyView.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.widgets; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.View; 6 | import android.widget.RelativeLayout; 7 | 8 | /** 9 | * Created by yqd on 14/12/4. 10 | */ 11 | public class OnlyView extends RelativeLayout { 12 | private View nowView = null; 13 | public OnlyView(Context context) { 14 | this(context, null); 15 | } 16 | 17 | public OnlyView(Context context, AttributeSet attrs) { 18 | this(context, attrs, 0); 19 | } 20 | 21 | public OnlyView(Context context, AttributeSet attrs, int defStyle) { 22 | super(context, attrs, defStyle); 23 | init(); 24 | } 25 | 26 | // we will select the first visible view as now target view to show, if none we will choose the first view. 27 | private void init() { 28 | int cout = this.getChildCount(); 29 | for (int i = 0; i < cout; i ++){ 30 | View v = this.getChildAt(i); 31 | if (v.getVisibility() == View.VISIBLE){ 32 | nowView = v; 33 | return; 34 | } 35 | } 36 | if (null == nowView){ 37 | nowView = this.getChildAt(0); 38 | } 39 | } 40 | public void setChildView(View view){ 41 | if (nowView == view){ 42 | return; 43 | } 44 | int cout = this.getChildCount(); 45 | for (int i = 0; i < cout; i ++){ 46 | View v = this.getChildAt(i); 47 | if (v == view){ 48 | v.setVisibility(View.VISIBLE); 49 | }else{ 50 | v.setVisibility(View.GONE); 51 | }; 52 | } 53 | } 54 | public View getChildView(){ 55 | return nowView; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/widgets/VoicePress.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.widgets; 2 | 3 | import android.app.Activity; 4 | import android.content.pm.PackageInfo; 5 | import android.content.pm.PackageManager; 6 | import android.os.Bundle; 7 | import android.os.Environment; 8 | import android.os.Handler; 9 | import android.os.SystemClock; 10 | import android.speech.SpeechRecognizer; 11 | import android.view.Gravity; 12 | import android.view.LayoutInflater; 13 | import android.view.MotionEvent; 14 | import android.view.View; 15 | import android.view.ViewGroup; 16 | import android.widget.ImageView; 17 | import android.widget.PopupWindow; 18 | import android.widget.TextView; 19 | 20 | import com.king.chatview.R; 21 | import com.king.chatview.fragment.BaseFragment; 22 | import com.king.chatview.tools.DImenUtil; 23 | 24 | import java.util.ArrayList; 25 | 26 | /** 27 | * Created by Administrator on 2015/11/10. 28 | */ 29 | public class VoicePress extends BaseFragment { 30 | private View rootView = null; 31 | private TextView sayTextView; 32 | 33 | private PopupWindow popupWindow, popupCancelWindow; 34 | private View hintView, hintCancelView; 35 | 36 | private ImageView volume; 37 | private boolean hasPermission = false; 38 | 39 | private Handler mHandler = new Handler(); 40 | private SpeechRecognizer mRecognizer; 41 | private String mVoiceName; 42 | private String voiceRecognizedResult; 43 | private int voiceDuration; 44 | private boolean voiceCanceled; 45 | // private RecognizerListener mRecognizeListener; 46 | private static final String VOICE_DIR 47 | = Environment.getExternalStorageDirectory().getPath() + "/baixingchat/"; 48 | private voiceMessageListener listener = null; 49 | 50 | public static interface voiceMessageListener { 51 | public void onSendVoiceMessage(String path, int duration, String description); 52 | } 53 | 54 | public void setListener(voiceMessageListener listener){ 55 | this.listener = listener; 56 | } 57 | 58 | @Override 59 | protected View onInitializeView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 60 | rootView = inflater.inflate(R.layout.voice_press, container, false); 61 | sayTextView = (TextView)rootView.findViewById(R.id.press_to_talk); 62 | init(); 63 | return rootView; 64 | } 65 | 66 | private void init() { 67 | initHintView(); 68 | initListeners(); 69 | // initSpeechUtility(); 70 | } 71 | 72 | private void initHintView() { 73 | Activity activity = this.getActivity(); 74 | hintView = LayoutInflater.from(activity).inflate(R.layout.avos_input_voice, null); 75 | volume = (ImageView) hintView.findViewById(R.id.id_voice_amplitude); 76 | hintCancelView = LayoutInflater.from(activity).inflate(R.layout.avos_voice_cancel, null); 77 | popupWindow = new PopupWindow(activity); 78 | popupWindow.setContentView(hintView); 79 | popupWindow.setWidth(DImenUtil.dip2px(activity, 200)); popupWindow.setHeight(DImenUtil.dip2px(activity, 200)); 80 | popupCancelWindow = new PopupWindow(activity); 81 | popupCancelWindow.setContentView(hintCancelView); 82 | popupCancelWindow.setWidth(DImenUtil.dip2px(activity, 200)); popupCancelWindow.setHeight(DImenUtil.dip2px(activity, 200)); 83 | 84 | } 85 | 86 | private void initListeners() { 87 | sayTextView.setOnTouchListener(new View.OnTouchListener() { 88 | 89 | @Override 90 | public boolean onTouch(View v, MotionEvent event) { 91 | float eventY = event.getY(); 92 | if (event.getAction() == MotionEvent.ACTION_MOVE) { 93 | if (eventY < -100) {//手指在上面,应hint上滑取消 94 | if (popupWindow.isShowing()) { 95 | popupWindow.dismiss(); 96 | } 97 | if (popupCancelWindow != null && !popupCancelWindow.isShowing()) { 98 | popupCancelWindow.showAtLocation(v, Gravity.CENTER, 0, 0); 99 | } 100 | } else {//手指在下面,应hint松开取消 101 | if (popupCancelWindow.isShowing()) { 102 | popupCancelWindow.dismiss(); 103 | } 104 | if (popupWindow != null && !popupWindow.isShowing()) { 105 | popupWindow.showAtLocation(v, Gravity.CENTER, 0, 0); 106 | } 107 | } 108 | } 109 | 110 | if (event.getAction() == MotionEvent.ACTION_UP) { 111 | if (popupWindow.isShowing()) { 112 | popupWindow.dismiss(); 113 | } 114 | if (popupCancelWindow.isShowing()) { 115 | popupCancelWindow.dismiss(); 116 | } 117 | ((TextView) v).setText("按住说话"); 118 | v.setBackgroundResource(R.drawable.talk_btn_bg); 119 | stop(); 120 | if (eventY > -100 && hasPermission) {//未取消 121 | voiceCanceled = false; 122 | } else { 123 | voiceCanceled = true; 124 | } 125 | } else if (event.getAction() == MotionEvent.ACTION_DOWN) { 126 | 127 | ((TextView) v).setText("松开结束"); 128 | v.setBackgroundResource(R.drawable.talk_btn_bg_press); 129 | long startVoiceT = SystemClock.currentThreadTimeMillis(); 130 | mVoiceName = startVoiceT + ""; 131 | // Log.e("mVoiceName set to", mVoiceName); 132 | start(); 133 | } 134 | return true; 135 | } 136 | }); 137 | } 138 | 139 | String getVoiceNameWithoutSuffix() { 140 | return mVoiceName; 141 | } 142 | private static final int POLL_INTERVAL = 300; 143 | private void start() { 144 | // Log.e("ChatInputLayout#start", "entering"); 145 | voiceRecognizedResult = ""; 146 | voiceDuration = 0; 147 | 148 | if (!hasPermission) { 149 | if (!judgePermission()) { 150 | return; 151 | } 152 | } 153 | // BaixingToast.showToast(this.getAppContext(), "开始录音"); 154 | // 155 | // mRecognizer = SpeechRecognizer.createRecognizer(this.getActivity(), null); 156 | // 157 | // mRecognizer.setParameter(SpeechConstant.DOMAIN, "iat"); 158 | // mRecognizer.setParameter(SpeechConstant.SAMPLE_RATE, "8000"); 159 | // mRecognizer.setParameter(SpeechConstant.ACCENT, "mandarin"); 160 | // mRecognizer.setParameter(SpeechConstant.ASR_AUDIO_PATH, VOICE_DIR + mVoiceName + ".pcm"); 161 | 162 | // initRecognizeListener(); 163 | // Log.e("ChatInputLayout#start", "before listening " + mRecognizer.isListening()); 164 | 165 | // int startCode = mRecognizer.startListening(mRecognizeListener); 166 | // Log.e("ChatInputLayout#start", "exiting, listener: " + mRecognizeListener.toString()); 167 | // Log.e("ChatInputLayout#start", "startCode " + startCode + " isListening " + mRecognizer.isListening()); 168 | } 169 | 170 | 171 | private void stop() { 172 | if (mRecognizer == null){ 173 | return; 174 | } 175 | } 176 | 177 | private boolean judgePermission() { 178 | PackageInfo packageInfo; 179 | try { 180 | packageInfo = this.getActivity().getPackageManager().getPackageInfo(this.getActivity().getPackageName(), PackageManager.GET_PERMISSIONS); 181 | String permissions[] = packageInfo.requestedPermissions; 182 | ArrayList list = new ArrayList(); 183 | for (int i = 0; i < permissions.length; i++) { 184 | list.add(permissions[i]); 185 | } 186 | if (list.contains("android.permission.RECORD_AUDIO")) { 187 | hasPermission = true; 188 | } else { 189 | hasPermission = false; 190 | } 191 | } catch (Exception e) { 192 | e.printStackTrace(); 193 | } 194 | return hasPermission; 195 | } 196 | 197 | private void updateDisplay(double signalEMA) { 198 | 199 | switch ((int) signalEMA) { 200 | case 0: 201 | volume.setImageResource(R.drawable.amp1); 202 | break; 203 | case 1: 204 | volume.setImageResource(R.drawable.amp2); 205 | 206 | break; 207 | case 2: 208 | volume.setImageResource(R.drawable.amp3); 209 | break; 210 | case 4: 211 | volume.setImageResource(R.drawable.amp4); 212 | break; 213 | case 5: 214 | volume.setImageResource(R.drawable.amp5); 215 | break; 216 | case 6: 217 | volume.setImageResource(R.drawable.amp6); 218 | break; 219 | default: 220 | volume.setImageResource(R.drawable.amp7); 221 | break; 222 | } 223 | } 224 | } 225 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/widgets/emotion/EmotionView.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.widgets.emotion; 2 | 3 | import android.content.Context; 4 | import android.support.v4.view.ViewPager; 5 | import android.util.AttributeSet; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.widget.ImageButton; 9 | import android.widget.ImageView; 10 | import android.widget.LinearLayout; 11 | import android.widget.RelativeLayout; 12 | 13 | import com.king.chatview.R; 14 | import com.king.chatview.tools.DImenUtil; 15 | import com.king.chatview.widgets.CustomIndicator; 16 | import com.king.chatview.widgets.emotion.adapter.BaseEmotionAdapter; 17 | import com.king.chatview.widgets.emotion.adapter.CustomEmotionAdapter; 18 | import com.king.chatview.widgets.emotion.adapter.EmotionAdapter; 19 | import com.king.chatview.widgets.emotion.data.Emoticon; 20 | import com.king.chatview.widgets.emotion.data.EmotionData; 21 | import com.king.chatview.widgets.emotion.item.StickerItem; 22 | 23 | import java.util.ArrayList; 24 | import java.util.List; 25 | 26 | /** 27 | * Created by Administrator on 2015/11/11. 28 | */ 29 | public class EmotionView extends LinearLayout { 30 | 31 | public interface EmotionClickListener { 32 | void OnEmotionClick(Emoticon emotionData, View v, EmotionData.EmotionCategory category); 33 | 34 | void OnUniqueEmotionClick(Emoticon uniqueItem, View v, EmotionData.EmotionCategory category); 35 | } 36 | 37 | private EmotionClickListener emotionClickListener; 38 | 39 | private List emotionDataList; 40 | 41 | private RelativeLayout emotionLinearLayout; 42 | private ViewPager emotionViewPager; 43 | private CustomIndicator emotionIndicator; 44 | 45 | private LinearLayout stickersSlider; 46 | private List stickerList = new ArrayList<>(); 47 | private int currentStickerIndex = 0; 48 | 49 | // 用来添加表情包的按钮 50 | private ImageView addStickers; 51 | 52 | private List emotionAdapterList; 53 | 54 | private Context mContext; 55 | 56 | public EmotionView(Context context) { 57 | this(context, null); 58 | } 59 | 60 | public EmotionView(Context context, AttributeSet attrs) { 61 | this(context, attrs, 0); 62 | } 63 | 64 | public EmotionView(Context context, AttributeSet attrs, int defStyleAttr) { 65 | super(context, attrs, defStyleAttr); 66 | mContext = context; 67 | } 68 | 69 | private void init(Context context, List emotionDataList) { 70 | LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 71 | //加载布局文件 72 | mInflater.inflate(R.layout.emotion_view, this, true); 73 | 74 | emotionLinearLayout = (RelativeLayout) findViewById(R.id.emotionLinearLayout); 75 | emotionViewPager = (ViewPager) findViewById(R.id.emotionViewPager); 76 | emotionIndicator = (CustomIndicator) findViewById(R.id.emotionIndicator); 77 | 78 | stickersSlider = (LinearLayout) findViewById(R.id.stickers_slider); 79 | // 暂时未使用 80 | addStickers = (ImageView) findViewById(R.id.add_stickers); 81 | 82 | // 重构 83 | // 初始化tab 84 | initStickers(emotionDataList); 85 | 86 | // 点开界面第一个tab元素必须被初始化 87 | emotionAdapterList = new ArrayList<>(); 88 | int index = 0; 89 | for (EmotionData data : emotionDataList) { 90 | BaseEmotionAdapter emotionAdapter = this.createEmotionAdapter(data); 91 | if (index == 0) { 92 | // emoji 93 | this.setEmotionAdapter(emotionAdapter); 94 | } 95 | emotionAdapterList.add(emotionAdapter); 96 | index++; 97 | } 98 | 99 | emotionViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 100 | @Override 101 | public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 102 | } 103 | 104 | @Override 105 | public void onPageSelected(int position) { 106 | emotionIndicator.setCurrentPosition(position); 107 | } 108 | 109 | @Override 110 | public void onPageScrollStateChanged(int state) { 111 | } 112 | }); 113 | } 114 | 115 | private void addStickerButton(ImageButton button) { 116 | stickersSlider.addView(button); 117 | stickerList.add(button); 118 | } 119 | 120 | private void showEmotionIndicator(int count) { 121 | emotionIndicator.setDotCount(count); 122 | emotionIndicator.setDotHeight(DImenUtil.dip2px(mContext, 5)); 123 | emotionIndicator.setDotWidth(DImenUtil.dip2px(mContext, 5)); 124 | emotionIndicator.setDotMargin(DImenUtil.dip2px(mContext, 10)); 125 | emotionIndicator.show(); 126 | } 127 | 128 | private void initStickers(List emotionDataList) { 129 | int index = 0; 130 | for (EmotionData data : emotionDataList) { 131 | final StickerItem stickerTab = new StickerItem(mContext, data.getStickerIcon()); 132 | this.addStickerButton(stickerTab); 133 | if (index == 0) { 134 | // 初始化选中第一个tab 135 | stickerTab.setSelected(true); 136 | } 137 | // 设置监听 138 | final int tempIndex = index; 139 | stickerTab.setOnClickListener(new OnClickListener() { 140 | @Override 141 | public void onClick(View v) { 142 | for (ImageButton temp : stickerList) { 143 | temp.setSelected(false); 144 | } 145 | stickerTab.setSelected(true); 146 | switchOtherStickers(tempIndex); 147 | } 148 | }); 149 | index++; 150 | } 151 | } 152 | 153 | private BaseEmotionAdapter createEmotionAdapter(EmotionData data) { 154 | BaseEmotionAdapter adapter = null; 155 | switch (data.getCategory()) { 156 | case emoji: 157 | adapter = new EmotionAdapter(mContext, emotionViewPager, data, emotionClickListener); 158 | break; 159 | case image: 160 | adapter = new CustomEmotionAdapter(mContext, emotionViewPager, data, emotionClickListener); 161 | default: 162 | } 163 | return adapter; 164 | } 165 | 166 | private void switchOtherStickers(int index) { 167 | this.currentStickerIndex = index; 168 | this.setEmotionAdapter(emotionAdapterList.get(index)); 169 | } 170 | 171 | private void setEmotionAdapter(BaseEmotionAdapter adapter) { 172 | emotionViewPager.setAdapter(adapter); 173 | showEmotionIndicator(adapter.getCount()); 174 | } 175 | 176 | /** 177 | * EmotionView 在 findViewById 获得引用后所必须调用函数(即为对于该View的初始化)
178 | * 必须位于 setEmotionClickListener 之前
179 | * 必须位于 modifyEmotionDataList 之前
180 | * @param emotionDataList 组织好的用于填充EmotionView的数据结构体 181 | */ 182 | public void setEmotionDataList(List emotionDataList) { 183 | this.emotionDataList = emotionDataList; 184 | init(mContext, emotionDataList); 185 | } 186 | 187 | public List getEmotionDataList() { 188 | return emotionDataList; 189 | } 190 | 191 | public EmotionClickListener getEmotionClickListener() { 192 | return emotionClickListener; 193 | } 194 | 195 | public void setEmotionClickListener(EmotionClickListener emotionClickListener) { 196 | this.emotionClickListener = emotionClickListener; 197 | if (emotionAdapterList == null) { 198 | throw new NullPointerException("设置监听前必须先设定表情的List"); 199 | } 200 | for (BaseEmotionAdapter adapter : emotionAdapterList) { 201 | adapter.setEmotionClickListener(emotionClickListener); 202 | } 203 | } 204 | 205 | public void modifyEmotionDataList(EmotionData data, int position) { 206 | if (emotionDataList == null) { 207 | throw new NullPointerException("修改List前必须先设定表情的List"); 208 | } 209 | emotionDataList.set(position, data); 210 | BaseEmotionAdapter adapter = createEmotionAdapter(data); 211 | emotionAdapterList.set(position, adapter); 212 | if (position == currentStickerIndex) { 213 | setEmotionAdapter(adapter); 214 | } 215 | } 216 | } 217 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/widgets/emotion/adapter/BaseEmotionAdapter.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.widgets.emotion.adapter; 2 | 3 | import android.content.Context; 4 | import android.support.annotation.NonNull; 5 | import android.support.v4.view.PagerAdapter; 6 | import android.support.v4.view.ViewPager; 7 | import android.util.DisplayMetrics; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.AdapterView; 11 | import android.widget.BaseAdapter; 12 | import android.widget.GridView; 13 | 14 | import com.king.chatview.widgets.emotion.EmotionView; 15 | import com.king.chatview.widgets.emotion.data.Emoticon; 16 | import com.king.chatview.widgets.emotion.data.EmotionData; 17 | 18 | /** 19 | * Created by Administrator on 2015/11/12. 20 | */ 21 | public abstract class BaseEmotionAdapter extends PagerAdapter implements GridView.OnItemClickListener { 22 | protected static final String EMOTION_ADAPTER_TAG = "emotion_adapter"; 23 | protected static final int INDEX_TAG = -1001; 24 | 25 | protected Context mContext; 26 | protected ViewPager mEmotionViewPager; 27 | protected EmotionData mEmotionData; 28 | protected EmotionView.EmotionClickListener mEmotionClickListener; 29 | 30 | /** 31 | * 表示在横向上,一个元素能够分得到的长度大小(包含margin&padding) 32 | */ 33 | protected int mSize; 34 | /** 35 | * 表示总共有几页 36 | */ 37 | protected int mCount; 38 | 39 | protected int viewPageWidth; 40 | 41 | protected ViewHolder mViewHolder; 42 | 43 | protected int mRow; 44 | protected int mColumn; 45 | /** 46 | * 表示一页有几个元素 47 | */ 48 | protected int mPageCount; 49 | 50 | public void setEmotionClickListener(EmotionView.EmotionClickListener clickListener) { 51 | this.mEmotionClickListener = clickListener; 52 | } 53 | 54 | public BaseEmotionAdapter(Context context, ViewPager viewPager, EmotionData emotionData, EmotionView.EmotionClickListener emotionClickListener) { 55 | this.mContext = context; 56 | this.mEmotionViewPager = viewPager; 57 | this.mEmotionData = emotionData; 58 | this.mEmotionClickListener = emotionClickListener; 59 | init(emotionData); 60 | } 61 | 62 | private void init(EmotionData emotionData) { 63 | mRow = emotionData.getRow(); 64 | mColumn = emotionData.getColumn(); 65 | // 计算一页有几个元素 66 | mPageCount = calcPageCount(emotionData); 67 | // 计算总共有几页 68 | mCount = calcPageNumber(emotionData, mPageCount); 69 | DisplayMetrics dm = mContext.getResources().getDisplayMetrics(); 70 | viewPageWidth = dm.widthPixels; 71 | mSize = calcItemSize(viewPageWidth); 72 | } 73 | 74 | /** 75 | * 计算每页有几个元素 76 | * 77 | * @param emotionData 用于提供行列和其他信息 78 | * @return 返回每页需要有几个元素 79 | */ 80 | protected int calcPageCount(EmotionData emotionData) { 81 | return emotionData.getRow() * emotionData.getColumn(); 82 | } 83 | 84 | /** 85 | * 计算总共会有几页 86 | * 87 | * @param emotionData 提供表情的list 88 | * @param pageCount 每页会出现的表情数 89 | * @return 返回总共的页数 90 | */ 91 | protected int calcPageNumber(EmotionData emotionData, int pageCount) { 92 | int listSize = emotionData.getEmotionList().size(); 93 | int pageNumber = 0; 94 | if (listSize % mPageCount > 0) 95 | pageNumber = listSize / mPageCount + 1; 96 | else { 97 | pageNumber = listSize / mPageCount; 98 | } 99 | return pageNumber; 100 | } 101 | 102 | /** 103 | * 计算每个元素在总宽上的均分大小(元素为正方形,高度不可知,故只能通过宽度) 104 | * 105 | * @param viewPageWidth 屏幕的宽度(屏幕宽即这个view的宽度,单位像素) 106 | * @return 返回每个元素在总宽的均分大小 107 | */ 108 | protected int calcItemSize(int viewPageWidth) { 109 | return viewPageWidth / mColumn; 110 | } 111 | 112 | @Override 113 | public int getCount() { 114 | return mCount; 115 | } 116 | 117 | @Override 118 | public boolean isViewFromObject(View view, Object object) { 119 | ViewHolder holder = (ViewHolder) object; 120 | return view == holder.gridView; 121 | } 122 | 123 | @Override 124 | public final Object instantiateItem(ViewGroup container, int position) { 125 | GridView gridView; 126 | T adapter; 127 | ViewHolder holder; 128 | if (this.mViewHolder == null) { 129 | gridView = instantiateGridView(); 130 | if (gridView == null) 131 | throw new NullPointerException("gridView 必须被实例化"); 132 | gridView.setNumColumns(mColumn); 133 | 134 | // emotionViewPager在initData阶段是可能没有高度的(gone) 只有在emotionViewPager进行页面填充的时候才一定会有高度 135 | int viewPageHeight = getEmotionPageViewHeight(); 136 | gridView = setGridViewMinimumHeight(gridView, viewPageHeight); 137 | setGridViewSpacing(gridView, viewPageHeight, viewPageWidth); 138 | 139 | adapter = createListAdapter(position); 140 | if (adapter == null) 141 | throw new NullPointerException("adapter 必须被实例化"); 142 | 143 | holder = new ViewHolder(); 144 | holder.gridView = gridView; 145 | holder.adapter = adapter; 146 | } else { 147 | gridView = mViewHolder.gridView; 148 | adapter = mViewHolder.adapter; 149 | holder = mViewHolder; 150 | mViewHolder = null; 151 | } 152 | bingData(adapter, position); 153 | gridView.setAdapter(adapter); 154 | gridView.setOnItemClickListener(this); 155 | container.addView(gridView); 156 | return holder; 157 | } 158 | 159 | @NonNull 160 | public abstract GridView instantiateGridView(); 161 | 162 | @Override 163 | public void onItemClick(AdapterView parent, View view, int position, long id) { 164 | if (mEmotionClickListener == null) 165 | return; 166 | Emoticon emoticon = (Emoticon) parent.getItemAtPosition(position); 167 | if (emoticon.getEmoticonType() == Emoticon.EmoticonType.UNIQUE) { 168 | mEmotionClickListener.OnUniqueEmotionClick(mEmotionData.getUniqueItem(), view, mEmotionData.getCategory()); 169 | } else { 170 | mEmotionClickListener.OnEmotionClick(emoticon, view, mEmotionData.getCategory()); 171 | } 172 | OnEmoticonClick(emoticon, view); 173 | } 174 | 175 | protected void OnEmoticonClick(Emoticon emoticon, View view) { 176 | } 177 | 178 | @NonNull 179 | public abstract T createListAdapter(int currentPageNumber); 180 | 181 | public abstract T bingData(T listAdapter, int position); 182 | 183 | protected GridView setGridViewMinimumHeight(GridView gridView, int height) { 184 | gridView.setMinimumHeight(height); 185 | return gridView; 186 | } 187 | 188 | protected void setGridViewSpacing(GridView gridView, int viewPageHeight, int viewPageWeight) { 189 | int verticalSpacing = viewPageHeight / mRow - mSize; 190 | if (verticalSpacing < 0) 191 | verticalSpacing = 0; 192 | gridView.setVerticalSpacing(verticalSpacing); 193 | } 194 | 195 | private int getEmotionPageViewHeight() { 196 | return View.MeasureSpec.getSize(mEmotionViewPager.getMeasuredHeight()); 197 | } 198 | 199 | 200 | public abstract EmotionData getEmotionData(); 201 | 202 | public abstract void setEmotionData(EmotionData emotionData); 203 | 204 | @Override 205 | public void destroyItem(ViewGroup container, int position, Object object) { 206 | this.mViewHolder = (ViewHolder) object; 207 | container.removeView(this.mViewHolder.gridView); 208 | } 209 | 210 | public abstract class BaseListAdapter extends BaseAdapter { 211 | @Override 212 | public final Object getItem(int position) { 213 | return getEmoticonItem(position); 214 | } 215 | 216 | public abstract Emoticon getEmoticonItem(int position); 217 | } 218 | 219 | protected class ViewHolder { 220 | GridView gridView; 221 | T adapter; 222 | } 223 | 224 | 225 | 226 | } 227 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/widgets/emotion/adapter/CustomEmotionAdapter.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.widgets.emotion.adapter; 2 | 3 | import android.content.Context; 4 | import android.graphics.Color; 5 | import android.graphics.drawable.ColorDrawable; 6 | import android.support.annotation.NonNull; 7 | import android.support.v4.view.ViewPager; 8 | import android.util.Log; 9 | import android.view.Gravity; 10 | import android.view.LayoutInflater; 11 | import android.view.View; 12 | import android.view.ViewGroup; 13 | import android.widget.GridView; 14 | import android.widget.ImageButton; 15 | import android.widget.ImageView; 16 | import android.widget.ListView; 17 | import android.widget.RelativeLayout; 18 | 19 | import com.bumptech.glide.Glide; 20 | import com.king.chatview.R; 21 | import com.king.chatview.widgets.emotion.EmotionView; 22 | import com.king.chatview.widgets.emotion.data.Emoticon; 23 | import com.king.chatview.widgets.emotion.data.EmotionData; 24 | 25 | import java.util.ArrayList; 26 | import java.util.List; 27 | 28 | /** 29 | * Created by Administrator on 2015/11/13. 30 | */ 31 | public class CustomEmotionAdapter extends BaseEmotionAdapter { 32 | /** 33 | * 可能会添加uniqueItem至list的index为0的在该adapter操作的List副本 34 | */ 35 | private List customImgPathList; 36 | private List pageAdapterList = new ArrayList<>(); 37 | 38 | public CustomEmotionAdapter(Context context, ViewPager viewPager, EmotionData emotionData, EmotionView.EmotionClickListener emotionClickListener) { 39 | super(context, viewPager, emotionData, emotionClickListener); 40 | initData(emotionData); 41 | } 42 | 43 | private void initData(EmotionData emotionData) { 44 | if (emotionData.getUniqueItem() != null) { 45 | customImgPathList = new ArrayList<>(emotionData.getEmotionList()); 46 | customImgPathList.add(0, emotionData.getUniqueItem()); 47 | } else { 48 | customImgPathList = emotionData.getEmotionList(); 49 | } 50 | } 51 | 52 | @Override 53 | protected int calcPageNumber(EmotionData emotionData, int pageCount) { 54 | int listSize = emotionData.getEmotionList().size(); 55 | if (emotionData.getUniqueItem() != null) 56 | listSize++; 57 | 58 | int pageNumber; 59 | if (listSize % mPageCount > 0) 60 | pageNumber = listSize / mPageCount + 1; 61 | else { 62 | pageNumber = listSize / mPageCount; 63 | } 64 | return pageNumber; 65 | } 66 | 67 | @NonNull 68 | @Override 69 | public GridView instantiateGridView() { 70 | GridView gridView = (GridView) LayoutInflater.from(mContext).inflate(R.layout.bx_emotion, null); 71 | gridView.setScrollContainer(false); 72 | // 去除 GridView 在点击元素后出现的变色效果 73 | gridView.setSelector(new ColorDrawable(Color.TRANSPARENT)); 74 | return gridView; 75 | } 76 | 77 | @NonNull 78 | @Override 79 | public CustomEmotionListAdapter createListAdapter(int currentPageNumber) { 80 | CustomEmotionListAdapter adapter = new CustomEmotionListAdapter(); 81 | pageAdapterList.add(adapter); 82 | return adapter; 83 | } 84 | 85 | @Override 86 | public CustomEmotionListAdapter bingData(CustomEmotionListAdapter listAdapter, int position) { 87 | int startP = position * mPageCount; 88 | int endP = (position + 1) * mPageCount > customImgPathList.size() ? customImgPathList.size() : (position + 1) * mPageCount; 89 | Emoticon[] list = customImgPathList.subList(startP, endP).toArray(new Emoticon[endP - startP]); 90 | listAdapter.setData(list); 91 | return listAdapter; 92 | } 93 | 94 | @Override 95 | public EmotionData getEmotionData() { 96 | return mEmotionData; 97 | } 98 | 99 | @Override 100 | public void setEmotionData(EmotionData emotionData) { 101 | List list = emotionData.getEmotionList(); 102 | customImgPathList = new ArrayList<>(list); 103 | customImgPathList.add(0, emotionData.getUniqueItem()); 104 | notifyDataSetChanged(); 105 | for (CustomEmotionListAdapter adapter : pageAdapterList) { 106 | adapter.notifyDataSetChanged(); 107 | } 108 | } 109 | 110 | class CustomEmotionListAdapter extends BaseEmotionAdapter.BaseListAdapter { 111 | private Emoticon[] emoticonArr; 112 | 113 | public void setData(Emoticon[] pathList) { 114 | this.emoticonArr = pathList; 115 | notifyDataSetChanged(); 116 | } 117 | 118 | @Override 119 | public int getCount() { 120 | return emoticonArr == null ? 0 : emoticonArr.length; 121 | } 122 | 123 | @Override 124 | public Emoticon getEmoticonItem(int position) { 125 | return emoticonArr == null ? null : emoticonArr[position]; 126 | } 127 | 128 | @Override 129 | public long getItemId(int position) { 130 | return position; 131 | } 132 | 133 | @Override 134 | public View getView(int position, View convertView, ViewGroup parent) { 135 | RelativeLayout containerLayout = new RelativeLayout(mContext); 136 | if (emoticonArr == null) { 137 | return containerLayout; 138 | } 139 | if (emoticonArr[position] != null) { 140 | ImageView img = new ImageView(mContext); 141 | img.setBackgroundResource(R.drawable.sticker_style); 142 | containerLayout.setLayoutParams(new GridView.LayoutParams(mSize, mSize)); 143 | containerLayout.setGravity(Gravity.CENTER); 144 | RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( 145 | ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 146 | params.setMargins(mSize / 9, mSize / 9, mSize / 9, mSize / 9); 147 | img.setLayoutParams(params); 148 | // 加载 149 | if (emoticonArr[position].getImagePath() != null) { 150 | Glide.with(mContext).load(emoticonArr[position].getImagePath()).centerCrop().into(img); 151 | } else { 152 | Log.e(BaseEmotionAdapter.EMOTION_ADAPTER_TAG, "Emoticon 的 getUri 必须被实现"); 153 | } 154 | // 对于ImageButton而言在GridView或者ListView中要不被ImageButton截获点击事件所需要的特殊设置 155 | // img.setFocusable(false); 156 | // img.setFocusableInTouchMode(false); 157 | // img.setClickable(false); 158 | containerLayout.addView(img); 159 | } 160 | // 对于ImageButton而言在GridView或者ListView中要不被ImageButton截获点击事件所需要的特殊设置 161 | // containerLayout.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 162 | return containerLayout; 163 | } 164 | } 165 | 166 | } 167 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/widgets/emotion/adapter/EmotionAdapter.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.widgets.emotion.adapter; 2 | 3 | import android.content.Context; 4 | import android.support.annotation.NonNull; 5 | import android.support.v4.view.ViewPager; 6 | import android.util.Log; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.GridView; 11 | import android.widget.ImageView; 12 | 13 | import com.king.chatview.R; 14 | import com.king.chatview.widgets.emotion.EmotionView; 15 | import com.king.chatview.widgets.emotion.data.Emoticon; 16 | import com.king.chatview.widgets.emotion.data.EmotionData; 17 | 18 | import java.util.List; 19 | 20 | /** 21 | * Created by Administrator on 2015/11/12. 22 | */ 23 | public class EmotionAdapter extends BaseEmotionAdapter { 24 | 25 | private Emoticon[][] mPageEmoticon; 26 | 27 | public int rate; 28 | private int item_length; 29 | 30 | public EmotionAdapter(Context context, ViewPager viewPager, EmotionData data, EmotionView.EmotionClickListener clickListener) { 31 | super(context, viewPager, data, clickListener); 32 | initData(data); 33 | } 34 | 35 | @Override 36 | protected int calcPageCount(EmotionData emotionData) { 37 | // 判断unique item 是否存在 存在就是-1 不存在就不处理 38 | int count = super.calcPageCount(emotionData); 39 | if (emotionData.getUniqueItem() != null) 40 | count = count - 1; 41 | return count; 42 | } 43 | 44 | private void initData(EmotionData data) { 45 | List emojiList = data.getEmotionList(); 46 | 47 | 48 | mPageEmoticon = new Emoticon[this.mCount][mRow * mColumn]; 49 | 50 | for (int i = 0; i < this.mCount; i++) { 51 | for (int j = 0; (j < mPageCount) && (i * mPageCount + j < emojiList.size()); j++) { 52 | Emoticon emoji = emojiList.get(i * mPageCount + j); 53 | mPageEmoticon[i][j] = emoji; 54 | } 55 | } 56 | rate = (viewPageWidth / (mColumn * 10 + 3)); 57 | item_length = (this.rate * 9); 58 | } 59 | 60 | @NonNull 61 | @Override 62 | public GridView instantiateGridView() { 63 | GridView gridView = (GridView) LayoutInflater.from(mContext).inflate(R.layout.bx_emotion, null); 64 | gridView.setScrollContainer(false); 65 | gridView.setPadding(this.rate * 2, this.rate * 2, this.rate * 2, 0); 66 | return gridView; 67 | } 68 | 69 | @NonNull 70 | @Override 71 | public EmotionListAdapter createListAdapter(int currentPageNumber) { 72 | return new EmotionListAdapter(); 73 | } 74 | 75 | @Override 76 | public EmotionListAdapter bingData(EmotionListAdapter listAdapter, int position) { 77 | listAdapter.setData(this.mPageEmoticon[position]); 78 | return listAdapter; 79 | } 80 | 81 | @Override 82 | protected void setGridViewSpacing(GridView gridView, int viewPageHeight, int viewPageWeight) { 83 | super.setGridViewSpacing(gridView, viewPageHeight, viewPageWeight); 84 | gridView.setHorizontalSpacing(rate); 85 | } 86 | 87 | @Override 88 | public EmotionData getEmotionData() { 89 | return mEmotionData; 90 | } 91 | 92 | @Override 93 | public void setEmotionData(EmotionData emotionData) { 94 | this.mEmotionData = emotionData; 95 | } 96 | 97 | class EmotionListAdapter extends BaseEmotionAdapter.BaseListAdapter { 98 | private Emoticon[] emoticonArr; 99 | public void setData(Emoticon[] emoticons) { 100 | this.emoticonArr = emoticons; 101 | notifyDataSetChanged(); 102 | } 103 | 104 | @Override 105 | public int getCount() { 106 | if (this.emoticonArr != null) { 107 | return this.emoticonArr.length; 108 | } 109 | return 0; 110 | } 111 | 112 | @Override 113 | public Emoticon getEmoticonItem(int position) { 114 | if (position == this.emoticonArr.length - 1) { 115 | return mEmotionData.getUniqueItem(); 116 | } 117 | return this.emoticonArr[position]; 118 | } 119 | 120 | @Override 121 | public long getItemId(int position) { 122 | return position; 123 | } 124 | 125 | @Override 126 | public View getView(int position, View convertView, ViewGroup parent) { 127 | ImageView img = new ImageView(mContext); 128 | 129 | img.setLayoutParams(new GridView.LayoutParams(item_length, item_length)); 130 | img.setPadding(rate, rate, rate, rate); 131 | 132 | img.setVisibility(View.INVISIBLE); 133 | 134 | if (mEmotionData.getUniqueItem() == null) { 135 | if (this.emoticonArr[position].getResourceId() != 0) { 136 | img.setImageResource(this.emoticonArr[position].getResourceId()); 137 | } else { 138 | Log.e(BaseEmotionAdapter.EMOTION_ADAPTER_TAG, "Emoticon的getResourceId必须被实现"); 139 | } 140 | img.setVisibility(View.VISIBLE); 141 | } else { 142 | if (this.emoticonArr[position] != null) { 143 | img.setImageResource(this.emoticonArr[position].getResourceId()); 144 | img.setVisibility(View.VISIBLE); 145 | } else if (position == this.emoticonArr.length - 1) { 146 | if (mEmotionData.getUniqueItem().getResourceId() != 0) 147 | img.setImageResource(mEmotionData.getUniqueItem().getResourceId()); 148 | else 149 | Log.e(BaseEmotionAdapter.EMOTION_ADAPTER_TAG, "Emoticon的getResourceId必须被实现"); 150 | img.setVisibility(View.VISIBLE); 151 | } 152 | } 153 | return img; 154 | } 155 | } 156 | } 157 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/widgets/emotion/data/CustomEmoji.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.widgets.emotion.data; 2 | 3 | import android.net.Uri; 4 | 5 | /** 6 | * Created by Administrator on 2015/11/16. 7 | */ 8 | public class CustomEmoji implements Emoticon { 9 | private String path; 10 | 11 | public CustomEmoji(String path) { 12 | this.path = path; 13 | } 14 | 15 | @Override 16 | public int getResourceId() { 17 | return 0; 18 | } 19 | 20 | @Override 21 | public String getImagePath() { 22 | return path; 23 | } 24 | 25 | @Override 26 | public Uri getUri() { 27 | return null; 28 | } 29 | 30 | @Override 31 | public String getDesc() { 32 | return path; 33 | } 34 | 35 | @Override 36 | public EmoticonType getEmoticonType() { 37 | return EmoticonType.NORMAL; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/widgets/emotion/data/Emoji.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.widgets.emotion.data; 2 | 3 | import android.net.Uri; 4 | 5 | /** 6 | * Created by Administrator on 2015/11/15. 7 | */ 8 | public class Emoji implements Emoticon { 9 | private int drawableResId; 10 | private int decInt; 11 | 12 | public Emoji(int drawableResId, int decInt) { 13 | this.drawableResId = drawableResId; 14 | this.decInt = decInt; 15 | } 16 | 17 | @Override 18 | public int getResourceId() { 19 | return drawableResId; 20 | } 21 | 22 | @Override 23 | public String getImagePath() { 24 | return null; 25 | } 26 | 27 | @Override 28 | public Uri getUri() { 29 | return null; 30 | } 31 | 32 | @Override 33 | public String getDesc() { 34 | return new String(Character.toChars(decInt)); 35 | } 36 | 37 | @Override 38 | public EmoticonType getEmoticonType() { 39 | return EmoticonType.NORMAL; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/widgets/emotion/data/Emoticon.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.widgets.emotion.data; 2 | 3 | import android.net.Uri; 4 | 5 | /** 6 | * Created by Administrator on 2015/11/16. 7 | */ 8 | public interface Emoticon { 9 | 10 | int getResourceId(); 11 | 12 | String getImagePath(); 13 | 14 | Uri getUri(); 15 | 16 | String getDesc(); 17 | 18 | EmoticonType getEmoticonType(); 19 | 20 | enum EmoticonType { 21 | NORMAL, UNIQUE 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/widgets/emotion/data/EmotionData.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.widgets.emotion.data; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Created by Administrator on 2015/11/14. 7 | */ 8 | public class EmotionData{ 9 | 10 | public String getStickerIcon() { 11 | return stickerIcon; 12 | } 13 | 14 | public enum EmotionCategory { 15 | emoji, image 16 | } 17 | 18 | private List emotionList; 19 | private String stickerIcon; 20 | private EmotionCategory category; 21 | private int row; 22 | private int column; 23 | private Emoticon uniqueItem; 24 | 25 | /** 26 | * EmotionView所展示的数据结构 27 | * @param emotionList emotionView中显示的图片资源或路径 28 | * @param stickerIcon 在emotionView下发显示的该表情组的icon 29 | * @param category emotionView的类别,现在暂时有 emoji 和 image 两种 30 | * @param row 需要显示的行 31 | * @param column 需要显示的列 32 | */ 33 | public EmotionData(List emotionList, String stickerIcon, EmotionCategory category, int row, int column) { 34 | this.emotionList = emotionList; 35 | this.stickerIcon = stickerIcon; 36 | this.category = category; 37 | this.row = row; 38 | this.column = column; 39 | } 40 | 41 | /** 42 | * EmotionView所展示的数据结构 43 | * @param emotionList emotionView中显示的图片资源或路径 44 | * @param stickerIcon 在emotionView下发显示的该表情组的icon 45 | * @param category emotionView的类别,现在暂时有 emoji 和 image 两种 46 | * @param uniqueItem 在这组表情中特有的表情 EmotionAdapter对应为 删除,CustomAdapter对应为添加 47 | * @param row 需要显示的行 48 | * @param column 需要显示的列 49 | */ 50 | public EmotionData(List emotionList, String stickerIcon, EmotionCategory category, Emoticon uniqueItem, int row, int column) { 51 | this(emotionList, stickerIcon, category, row, column); 52 | this.uniqueItem = uniqueItem; 53 | } 54 | 55 | public Emoticon getUniqueItem() { 56 | return uniqueItem; 57 | } 58 | 59 | public List getEmotionList() { 60 | return emotionList; 61 | } 62 | 63 | public void setEmotionList(List emotionList) { 64 | this.emotionList = emotionList; 65 | } 66 | 67 | public EmotionCategory getCategory() { 68 | return category; 69 | } 70 | 71 | public int getRow() { 72 | return row; 73 | } 74 | 75 | public int getColumn() { 76 | return column; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/widgets/emotion/data/UniqueEmoji.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.widgets.emotion.data; 2 | 3 | import android.net.Uri; 4 | 5 | /** 6 | * Created by Administrator on 2015/11/16. 7 | */ 8 | public class UniqueEmoji implements Emoticon { 9 | 10 | private int resourceId; 11 | private String path; 12 | 13 | public UniqueEmoji(int resourseId) { 14 | this.resourceId = resourseId; 15 | } 16 | 17 | public UniqueEmoji(String path) { 18 | this.path = path; 19 | } 20 | 21 | @Override 22 | public int getResourceId() { 23 | return resourceId; 24 | } 25 | 26 | @Override 27 | public String getImagePath() { 28 | return path; 29 | } 30 | 31 | @Override 32 | public Uri getUri() { 33 | return null; 34 | } 35 | 36 | @Override 37 | public String getDesc() { 38 | return path; 39 | } 40 | 41 | @Override 42 | public EmoticonType getEmoticonType() { 43 | return EmoticonType.UNIQUE; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/king/chatview/widgets/emotion/item/StickerItem.java: -------------------------------------------------------------------------------- 1 | package com.king.chatview.widgets.emotion.item; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.widget.ImageButton; 6 | 7 | import com.bumptech.glide.Glide; 8 | import com.king.chatview.R; 9 | 10 | /** 11 | * Created by Administrator on 2015/11/11. 12 | */ 13 | public class StickerItem extends ImageButton { 14 | 15 | private int itemWidth = 0; 16 | 17 | public StickerItem(Context context) { 18 | super(context); 19 | init(context); 20 | } 21 | 22 | public StickerItem(Context context, int backgroundResId) { 23 | this(context); 24 | Glide.with(context).load(backgroundResId).into(this); 25 | } 26 | 27 | public StickerItem(Context context, String path) { 28 | this(context); 29 | Glide.with(context).load(path).into(this); 30 | } 31 | 32 | public StickerItem(Context context, AttributeSet attrs) { 33 | this(context, attrs, 0); 34 | } 35 | 36 | public StickerItem(Context context, AttributeSet attrs, int defStyleAttr) { 37 | super(context, attrs, defStyleAttr); 38 | init(context); 39 | } 40 | 41 | private void init(Context context) { 42 | this.setScaleType(ScaleType.CENTER_INSIDE); 43 | this.setBackgroundResource(R.drawable.sticker_style); 44 | this.setPadding(5, 5, 5, 5); 45 | itemWidth = context.getResources().getDisplayMetrics().widthPixels / 4; 46 | } 47 | 48 | @Override 49 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 50 | if (itemWidth != 0) { 51 | widthMeasureSpec = MeasureSpec.makeMeasureSpec(itemWidth, MeasureSpec.EXACTLY); 52 | setMeasuredDimension(widthMeasureSpec, getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec)); 53 | } else { 54 | super.onMeasure(widthMeasureSpec, heightMeasureSpec); 55 | } 56 | } 57 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/avos_plusbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-hdpi/avos_plusbox.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/avos_plusbox_press.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-hdpi/avos_plusbox_press.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/icon_indicator_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-hdpi/icon_indicator_0.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/icon_indicator_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-hdpi/icon_indicator_1.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f004.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f30f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f30f.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f319.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f319.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f332.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f332.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f339.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f339.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f33b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f33b.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f349.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f349.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f356.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f356.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f35a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f35a.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f366.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f366.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f36b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f36b.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f377.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f377.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f37b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f37b.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f381.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f381.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f382.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f382.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f384.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f389.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f389.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f393.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f393.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f3a4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f3a4.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f3b2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f3b2.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f3b5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f3b5.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f3c0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f3c0.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f3c2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f3c2.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f3e1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f3e1.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f434.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f434.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f436.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f436.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f437.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f437.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f44a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f44a.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f44c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f44c.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f44d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f44d.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f44e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f44e.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f44f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f44f.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f451.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f451.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f46a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f46a.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f46b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f46b.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f47b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f47b.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f47c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f47c.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f47d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f47d.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f47f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f47f.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f484.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f484.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f48a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f48a.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f48b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f48b.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f48d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f48d.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f494.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f494.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f4a1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4a1.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f4a2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4a2.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f4a3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4a3.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f4a4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4a4.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f4a9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4a9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f4aa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4aa.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f4b0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4b0.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f4da.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4da.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f4de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4de.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f4e2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f4e2.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f525.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f525.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f52b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f52b.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f556.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f556.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f600.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f601.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f601.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f602.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f602.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f603.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f603.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f605.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f605.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f606.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f606.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f607.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f607.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f608.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f608.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f609.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f609.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f60a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f60a.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f60b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f60b.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f60c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f60c.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f60d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f60d.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f60e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f60e.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f60f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f60f.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f611.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f611.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f612.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f612.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f613.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f613.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f614.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f614.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f615.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f615.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f616.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f616.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f618.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f618.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f61a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f61a.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f61c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f61c.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f61d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f61d.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f61e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f61e.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f61f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f61f.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f621.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f621.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f622.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f622.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f623.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f623.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f624.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f624.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f628.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f628.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f629.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f629.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f62a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f62a.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f62b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f62b.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f62c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f62c.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f62d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f62d.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f62e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f62e.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f62f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f62f.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f630.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f630.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f631.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f631.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f632.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f632.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f633.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f633.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f634.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f634.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f635.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f635.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f636.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f636.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f637.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f637.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f648.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f648.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f649.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f649.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f64a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f64a.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f64f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f64f.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f680.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f680.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f6ab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f6ab.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f6b2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f6b2.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u1f6bf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u1f6bf.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u23f0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u23f0.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u23f3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u23f3.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u2600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u2600.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u2601.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u2601.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u2614.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u2614.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u2615.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u2615.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u261d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u261d.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u263a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u263a.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u26a1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u26a1.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u26bd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u26bd.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u26c4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u26c4.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u26c5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u26c5.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u270a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u270a.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u270b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u270b.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u270c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u270c.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u270f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u270f.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u2744.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u2744.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/u2b50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xhdpi/u2b50.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/amp1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/amp1.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/amp2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/amp2.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/amp3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/amp3.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/amp4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/amp4.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/amp5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/amp5.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/amp6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/amp6.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/amp7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/amp7.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/app_panel_ads_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/app_panel_ads_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/app_panel_ads_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/app_panel_ads_pressed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/app_panel_gallery_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/app_panel_gallery_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/app_panel_gallery_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/app_panel_gallery_pressed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/app_panel_location_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/app_panel_location_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/app_panel_location_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/app_panel_location_pressed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/app_panel_video_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/app_panel_video_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/app_panel_video_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/app_panel_video_pressed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/bx_emotion_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/bx_emotion_delete.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/chatting_setmode_keyboard_btn_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/chatting_setmode_keyboard_btn_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/chatting_setmode_keyboard_btn_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/chatting_setmode_keyboard_btn_pressed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/chatting_setmode_voice_btn_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/chatting_setmode_voice_btn_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/chatting_setmode_voice_btn_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/chatting_setmode_voice_btn_pressed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/emoji_select_btn_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/emoji_select_btn_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/emoji_select_btn_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/emoji_select_btn_pressed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/rcd_cancel_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/rcd_cancel_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/type_select_btn_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/type_select_btn_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/type_select_btn_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/type_select_btn_pressed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/voice_rcd_hint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atenjin/AndroidEmotionView/f59a64a6076bd28847495685fd8f4ab1479ba920/app/src/main/res/drawable-xxhdpi/voice_rcd_hint.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/app_panel_ads_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/app_panel_gallery_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/app_panel_location_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/app_panel_video_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_toolbox.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_call.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_call_disable.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_call_on.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/chat_editbox_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/chat_send_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/chatting_setmode_keyboard_btn_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/chatting_setmode_voice_btn_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/emoji_select_btn_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/post_finish_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/reddot.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/sticker_btn_normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 15 | 16 | 17 | 18 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/sticker_btn_selected.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 15 | 16 | 17 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/sticker_style.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/talk_btn_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/talk_btn_bg_press.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/type_select_btn_selector.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 17 | 23 | 24 | 27 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/res/layout/avos_input_voice.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 16 | 22 | 23 | 31 | 32 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/res/layout/avos_voice_cancel.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 16 | 22 | 23 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/layout/bx_emotion.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/chat_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 13 | 17 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/layout/chat_view_new.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 13 | 17 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/layout/emotion_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 12 | 21 | 22 | 28 | 29 | 30 | 31 | 35 | 39 | 44 | 45 | 46 | 47 | 51 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /app/src/main/res/layout/inputchat.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 22 | 23 | 28 | 29 |