├── .gitignore ├── .idea ├── .name ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── dictionaries │ └── DavidWang.xml ├── gradle.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── DWCorePhoto_Android.iml ├── DWCorePhoto_Android_Git.iml ├── GridShow.gif ├── ListShow.gif ├── MixShow.gif ├── README.md ├── SingleShow.gif ├── app ├── .gitignore ├── app.iml ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── davidwang │ │ └── tm │ │ └── dwcorephoto │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── davidwang │ │ └── tm │ │ ├── adapter │ │ ├── GridViewAdapter.java │ │ ├── ListViewAdapter.java │ │ ├── MainListAdapter.java │ │ └── MixListAdapter.java │ │ ├── dwcorephoto │ │ ├── BaseActivity.java │ │ ├── BaseApplication.java │ │ ├── GridViewActivity.java │ │ ├── ListViewActivity.java │ │ ├── MainActivity.java │ │ ├── MixShowActivity.java │ │ ├── PreviewImage.java │ │ └── SingleShow.java │ │ ├── model │ │ ├── DialogueInfo.java │ │ ├── ImageBDInfo.java │ │ ├── ImageInfo.java │ │ ├── MainInfo.java │ │ └── Mixinfo.java │ │ ├── tools │ │ └── ImageLoaders.java │ │ └── view │ │ ├── HackyViewPager.java │ │ ├── KeyboardLayout.java │ │ ├── PullToZoomListView.java │ │ └── SquareLayout.java │ └── res │ ├── drawable │ └── click_content.xml │ ├── layout │ ├── activity_browseimage.xml │ ├── activity_grid_view.xml │ ├── activity_list_view.xml │ ├── activity_main.xml │ ├── activity_mix_show.xml │ ├── activity_show_image.xml │ ├── activity_single_show.xml │ ├── evaluation_view.xml │ ├── grid_view.xml │ ├── list_view.xml │ ├── main_view.xml │ ├── mix_view.xml │ ├── mixshow_headview.xml │ └── waiting_view.xml │ ├── menu │ ├── menu_grid_view.xml │ ├── menu_list_view.xml │ ├── menu_main.xml │ ├── menu_mix_show.xml │ ├── menu_show_image.xml │ └── menu_single_show.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ ├── mixheadimg.jpeg │ └── userimg.jpg │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /local.properties 3 | /.idea/workspace.xml 4 | /.idea/libraries 5 | .DS_Store 6 | /build 7 | /captures 8 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | DWCorePhoto_Android_Git -------------------------------------------------------------------------------- /.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/dictionaries/DavidWang.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.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 | General 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 62 | 63 | 64 | 65 | 66 | 67 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /DWCorePhoto_Android.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /DWCorePhoto_Android_Git.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /GridShow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidWangTM/DWCorePhoto_Android/d8b8cda500e4809bccc16c3d48d1d85f1ac2d709/GridShow.gif -------------------------------------------------------------------------------- /ListShow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidWangTM/DWCorePhoto_Android/d8b8cda500e4809bccc16c3d48d1d85f1ac2d709/ListShow.gif -------------------------------------------------------------------------------- /MixShow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidWangTM/DWCorePhoto_Android/d8b8cda500e4809bccc16c3d48d1d85f1ac2d709/MixShow.gif -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DWCorePhoto_Android 2 | 1.图片浏览放大缩小。
3 | 2.单一图片点击,放大效果,和缩放效果。
4 | 3.列表图片点击,放大效果,和缩放效果。
5 | 4.网格图片点击,放大效果,和缩放效果。
6 | 5.增加列表混合布局
7 | 8 | 6.加入缩略图和原图加载过程--> 加入高清图变量hdimg。 9 | 10 | 如果有更多想法,联系我Q:232190315. 11 | > *此项目IOS地址:(https://github.com/DavidWangTM/DWCorePhoto) 12 | 13 | # 效果图,单张点击 14 | ![](https://raw.githubusercontent.com/DavidWangTM/DWCorePhoto_Android/master/SingleShow.gif) 15 | # 列表图,单张点击 16 | ![](https://raw.githubusercontent.com/DavidWangTM/DWCorePhoto_Android/master/ListShow.gif) 17 | # 网格图,单张点击 18 | ![](https://raw.githubusercontent.com/DavidWangTM/DWCorePhoto_Android/master/GridShow.gif) 19 | # 混合图,单张点击 20 | ![](https://raw.githubusercontent.com/DavidWangTM/DWCorePhoto_Android/master/MixShow.gif) 21 | -------------------------------------------------------------------------------- /SingleShow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DavidWangTM/DWCorePhoto_Android/d8b8cda500e4809bccc16c3d48d1d85f1ac2d709/SingleShow.gif -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/app.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 22 5 | buildToolsVersion "22.0.1" 6 | 7 | compileOptions { 8 | sourceCompatibility JavaVersion.VERSION_1_7 9 | targetCompatibility JavaVersion.VERSION_1_7 10 | } 11 | 12 | defaultConfig { 13 | minSdkVersion 15 14 | applicationId "davidwang.tm.dwcorephoto" 15 | targetSdkVersion 22 16 | versionCode 1 17 | versionName "1.0" 18 | } 19 | buildTypes { 20 | release { 21 | minifyEnabled false 22 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 23 | } 24 | } 25 | } 26 | 27 | dependencies { 28 | compile fileTree(dir: 'libs', include: ['*.jar']) 29 | compile 'com.android.support:appcompat-v7:22.2.1' 30 | compile 'com.github.chrisbanes.photoview:library:1.2.3' 31 | compile 'com.facebook.rebound:rebound:0.3.8' 32 | compile 'com.nineoldandroids:library:2.4.0' 33 | compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.4' 34 | compile 'com.readystatesoftware.systembartint:systembartint:1.0.3' 35 | compile 'com.nhaarman.listviewanimations:lib-core:3.1.0@aar' 36 | } 37 | -------------------------------------------------------------------------------- /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 /Users/DavidWang/Library/Android/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/davidwang/tm/dwcorephoto/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.dwcorephoto; 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 | 6 | 7 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 25 | 28 | 31 | 32 | 35 | 36 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/adapter/GridViewAdapter.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.adapter; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.util.Log; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.BaseAdapter; 9 | import android.widget.ImageView; 10 | 11 | import java.io.Serializable; 12 | import java.util.ArrayList; 13 | 14 | import davidwang.tm.dwcorephoto.GridViewActivity; 15 | import davidwang.tm.dwcorephoto.PreviewImage; 16 | import davidwang.tm.dwcorephoto.R; 17 | import davidwang.tm.model.ImageBDInfo; 18 | import davidwang.tm.model.ImageInfo; 19 | import davidwang.tm.tools.ImageLoaders; 20 | 21 | /** 22 | * Created by DavidWang on 15/9/6. 23 | */ 24 | public class GridViewAdapter extends BaseAdapter{ 25 | 26 | private Context context; 27 | private ArrayList data; 28 | private ImageBDInfo bdInfo; 29 | 30 | public GridViewAdapter(Context context, ArrayList data) { 31 | this.context = context; 32 | this.data = data; 33 | bdInfo = new ImageBDInfo(); 34 | } 35 | 36 | @Override 37 | public int getCount() { 38 | // TODO Auto-generated method stub 39 | return data.size(); 40 | } 41 | 42 | @Override 43 | public Object getItem(int arg0) { 44 | // TODO Auto-generated method stub 45 | return arg0; 46 | } 47 | 48 | @Override 49 | public long getItemId(int arg0) { 50 | // TODO Auto-generated method stub 51 | return arg0; 52 | } 53 | 54 | @Override 55 | public View getView(int position, View convertView, ViewGroup arg2) { 56 | ImageInfo info = data.get(position); 57 | ViewHolder holder = null; 58 | if (convertView == null) { 59 | holder = new ViewHolder(); 60 | convertView = View.inflate(context, 61 | R.layout.grid_view, null); 62 | holder.gridimage = (ImageView)convertView.findViewById(R.id.gridimage); 63 | 64 | convertView.setTag(holder); 65 | } else { 66 | holder = (ViewHolder) convertView.getTag(); 67 | } 68 | 69 | 70 | ImageLoaders.setsendimg(info.url, holder.gridimage); 71 | holder.gridimage.setOnClickListener(new ImageOnclick(position,holder.gridimage)); 72 | 73 | return convertView; 74 | } 75 | 76 | public class ViewHolder { 77 | ImageView gridimage; 78 | } 79 | 80 | private class ImageOnclick implements View.OnClickListener{ 81 | 82 | private int index; 83 | private ImageView imageView; 84 | 85 | public ImageOnclick(int index ,ImageView imageView) { 86 | this.index = index; 87 | this.imageView = imageView; 88 | } 89 | 90 | @Override 91 | public void onClick(View v) { 92 | 93 | GridViewActivity activity = (GridViewActivity)context; 94 | View c = activity.gridView.getChildAt(0); 95 | int top = c.getTop(); 96 | int firstVisiblePosition = activity.gridView.getFirstVisiblePosition() /3; 97 | 98 | int a,b; 99 | a = index / 3; 100 | b = index % 3; 101 | Log.e("1", "高==" + top + "=" + firstVisiblePosition + "b="+b); 102 | bdInfo.width = (activity.Width - 3 * dip2px(2))/3; 103 | bdInfo.height = bdInfo.width; 104 | bdInfo.x = dip2px(1) + b * bdInfo.width + b * dip2px(2); 105 | bdInfo.y = dip2px(1) + bdInfo.height * (a - firstVisiblePosition) + top + (a - firstVisiblePosition) *dip2px(2) + activity.gridView.getTop() - dip2px(1); 106 | Intent intent = new Intent(context, PreviewImage.class); 107 | intent.putExtra("data", (Serializable) data); 108 | intent.putExtra("bdinfo",bdInfo); 109 | intent.putExtra("index",index); 110 | intent.putExtra("type",2); 111 | context.startActivity(intent); 112 | } 113 | } 114 | 115 | public int dip2px(float dpValue) { 116 | final float scale = context.getResources().getDisplayMetrics().density; 117 | return (int) (dpValue * scale + 0.5f); 118 | } 119 | 120 | } 121 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/adapter/ListViewAdapter.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.adapter; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.BaseAdapter; 8 | import android.widget.ImageView; 9 | 10 | import java.io.Serializable; 11 | import java.util.ArrayList; 12 | 13 | import davidwang.tm.dwcorephoto.ListViewActivity; 14 | import davidwang.tm.dwcorephoto.PreviewImage; 15 | import davidwang.tm.dwcorephoto.R; 16 | import davidwang.tm.model.ImageBDInfo; 17 | import davidwang.tm.model.ImageInfo; 18 | import davidwang.tm.tools.ImageLoaders; 19 | 20 | /** 21 | * Created by DavidWang on 15/9/2. 22 | */ 23 | public class ListViewAdapter extends BaseAdapter{ 24 | 25 | private Context context; 26 | private ArrayList data; 27 | private ImageBDInfo bdInfo; 28 | 29 | public ListViewAdapter(Context context, ArrayList data) { 30 | this.context = context; 31 | this.data = data; 32 | bdInfo = new ImageBDInfo(); 33 | } 34 | 35 | @Override 36 | public int getCount() { 37 | // TODO Auto-generated method stub 38 | return data.size(); 39 | } 40 | 41 | @Override 42 | public Object getItem(int arg0) { 43 | // TODO Auto-generated method stub 44 | return arg0; 45 | } 46 | 47 | @Override 48 | public long getItemId(int arg0) { 49 | // TODO Auto-generated method stub 50 | return arg0; 51 | } 52 | 53 | @Override 54 | public View getView(int position, View convertView, ViewGroup arg2) { 55 | ImageInfo info = data.get(position); 56 | ViewHolder holder = null; 57 | if (convertView == null) { 58 | holder = new ViewHolder(); 59 | convertView = View.inflate(context, R.layout.list_view, null); 60 | holder.list_img = (ImageView)convertView.findViewById(R.id.list_img); 61 | 62 | convertView.setTag(holder); 63 | } else { 64 | holder = (ViewHolder) convertView.getTag(); 65 | } 66 | 67 | ImageLoaders.setsendimg(info.url,holder.list_img); 68 | holder.list_img.setOnClickListener(new ImageOnclick(position,holder.list_img)); 69 | 70 | return convertView; 71 | } 72 | 73 | public class ViewHolder { 74 | ImageView list_img; 75 | } 76 | 77 | private class ImageOnclick implements View.OnClickListener{ 78 | 79 | private int index; 80 | private ImageView imageView; 81 | 82 | public ImageOnclick(int index ,ImageView imageView) { 83 | this.index = index; 84 | this.imageView = imageView; 85 | } 86 | 87 | @Override 88 | public void onClick(View v) { 89 | ListViewActivity activity = (ListViewActivity)context; 90 | View c = activity.listView.getChildAt(0); 91 | int top = c.getTop(); 92 | int firstVisiblePosition = activity.listView.getFirstVisiblePosition(); 93 | bdInfo.x = imageView.getLeft(); 94 | bdInfo.y = dip2px(7) + (index - firstVisiblePosition) * dip2px(70) + top + activity.listView.getTop(); 95 | bdInfo.width = imageView.getLayoutParams().width; 96 | bdInfo.height = imageView.getLayoutParams().height; 97 | Intent intent = new Intent(context, PreviewImage.class); 98 | intent.putExtra("data", (Serializable) data); 99 | intent.putExtra("bdinfo",bdInfo); 100 | intent.putExtra("index",index); 101 | intent.putExtra("type",1); 102 | context.startActivity(intent); 103 | } 104 | } 105 | 106 | public int dip2px(float dpValue) { 107 | final float scale = context.getResources().getDisplayMetrics().density; 108 | return (int) (dpValue * scale + 0.5f); 109 | } 110 | 111 | /** 112 | * 根据手机的分辨率从 px(像素) 的单位 转成为 dp 113 | */ 114 | public int px2dip(float pxValue) { 115 | final float scale = context.getResources().getDisplayMetrics().density; 116 | return (int) (pxValue / scale + 0.5f); 117 | } 118 | 119 | } 120 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/adapter/MainListAdapter.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.adapter; 2 | 3 | import android.content.Context; 4 | import android.view.View; 5 | import android.view.ViewGroup; 6 | import android.widget.BaseAdapter; 7 | import android.widget.TextView; 8 | 9 | import java.util.ArrayList; 10 | 11 | import davidwang.tm.dwcorephoto.R; 12 | import davidwang.tm.model.MainInfo; 13 | 14 | /** 15 | * Created by DavidWang on 15/8/25. 16 | */ 17 | public class MainListAdapter extends BaseAdapter{ 18 | 19 | private Context context; 20 | private ArrayList data; 21 | 22 | public MainListAdapter(Context context, ArrayList data) { 23 | this.context = context; 24 | this.data = data; 25 | } 26 | 27 | @Override 28 | public int getCount() { 29 | // TODO Auto-generated method stub 30 | return data.size(); 31 | } 32 | 33 | @Override 34 | public Object getItem(int arg0) { 35 | // TODO Auto-generated method stub 36 | return arg0; 37 | } 38 | 39 | @Override 40 | public long getItemId(int arg0) { 41 | // TODO Auto-generated method stub 42 | return arg0; 43 | } 44 | 45 | @Override 46 | public View getView(int position, View convertView, ViewGroup arg2) { 47 | MainInfo info = data.get(position); 48 | ViewHolder holder = null; 49 | if (convertView == null) { 50 | holder = new ViewHolder(); 51 | convertView = View.inflate(context, 52 | R.layout.main_view, null); 53 | holder.main_text = (TextView)convertView.findViewById(R.id.main_text); 54 | 55 | convertView.setTag(holder); 56 | } else { 57 | holder = (ViewHolder) convertView.getTag(); 58 | } 59 | 60 | holder.main_text.setText(info.content); 61 | return convertView; 62 | } 63 | 64 | public class ViewHolder { 65 | TextView main_text; 66 | } 67 | 68 | 69 | } 70 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/adapter/MixListAdapter.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.adapter; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.os.Handler; 6 | import android.text.Layout; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.view.ViewTreeObserver; 10 | import android.view.inputmethod.InputMethodManager; 11 | import android.widget.BaseAdapter; 12 | import android.widget.EditText; 13 | import android.widget.GridLayout; 14 | import android.widget.ImageView; 15 | import android.widget.LinearLayout; 16 | import android.widget.TextView; 17 | 18 | import java.io.Serializable; 19 | import java.util.ArrayList; 20 | 21 | import davidwang.tm.dwcorephoto.MixShowActivity; 22 | import davidwang.tm.dwcorephoto.PreviewImage; 23 | import davidwang.tm.dwcorephoto.R; 24 | import davidwang.tm.model.DialogueInfo; 25 | import davidwang.tm.model.ImageBDInfo; 26 | import davidwang.tm.model.ImageInfo; 27 | import davidwang.tm.model.Mixinfo; 28 | import davidwang.tm.tools.ImageLoaders; 29 | 30 | /** 31 | * Created by DavidWang on 15/10/8. 32 | */ 33 | public class MixListAdapter extends BaseAdapter { 34 | 35 | private Context context; 36 | private ArrayList data; 37 | private ImageBDInfo bdInfo; 38 | private MixShowActivity activity; 39 | private int ImagaId[] = {R.id.img_0, R.id.img_1, R.id.img_2, R.id.img_3, R.id.img_4, R.id.img_5, R.id.img_6, R.id.img_7, R.id.img_8}; 40 | 41 | public MixListAdapter(Context context, ArrayList data) { 42 | this.context = context; 43 | this.data = data; 44 | bdInfo = new ImageBDInfo(); 45 | activity = (MixShowActivity) context; 46 | } 47 | 48 | @Override 49 | public int getCount() { 50 | // TODO Auto-generated method stub 51 | return data.size(); 52 | } 53 | 54 | @Override 55 | public Object getItem(int arg0) { 56 | // TODO Auto-generated method stub 57 | return arg0; 58 | } 59 | 60 | @Override 61 | public long getItemId(int arg0) { 62 | // TODO Auto-generated method stub 63 | return arg0; 64 | } 65 | 66 | @Override 67 | public View getView(int position, View convertView, ViewGroup arg2) { 68 | Mixinfo info = data.get(position); 69 | ViewHolder holder = null; 70 | if (convertView == null) { 71 | holder = new ViewHolder(); 72 | convertView = View.inflate(context, R.layout.mix_view, null); 73 | holder.list_img = (ImageView) convertView.findViewById(R.id.listuserimg); 74 | holder.username = (TextView) convertView.findViewById(R.id.username); 75 | holder.fullText = (TextView) convertView.findViewById(R.id.fullText); 76 | holder.usercontent = (TextView) convertView.findViewById(R.id.usercontent); 77 | holder.gridview = (GridLayout) convertView.findViewById(R.id.gridview); 78 | holder.showimage = (ImageView) convertView.findViewById(R.id.showimage); 79 | holder.allLayout = (LinearLayout) convertView.findViewById(R.id.allLayout); 80 | 81 | holder.evaluationLayout = (LinearLayout) convertView.findViewById(R.id.evaluationLayout); 82 | for (int i = 0; i < 9; i++) { 83 | holder.imgview[i] = (ImageView) convertView.findViewById(ImagaId[i]); 84 | } 85 | convertView.setTag(holder); 86 | } else { 87 | holder = (ViewHolder) convertView.getTag(); 88 | } 89 | 90 | ImageLoaders.setsendimg(info.userimg, holder.list_img); 91 | holder.username.setText(info.username); 92 | holder.usercontent.setText(info.content); 93 | holder.showimage.setVisibility(View.GONE); 94 | holder.gridview.setVisibility(View.GONE); 95 | if (info.data.size() == 1) { 96 | holder.showimage.setVisibility(View.VISIBLE); 97 | holder.gridview.setVisibility(View.GONE); 98 | ImageInfo imageInfo = info.data.get(0); 99 | float w = imageInfo.width; 100 | float h = imageInfo.height; 101 | float width = 0.0f; 102 | float height = 0.0f; 103 | if (w > h) { 104 | width = activity.Width - dip2px(130); 105 | height = width * h / w; 106 | } else if (w < h) { 107 | height = dip2px(220); 108 | width = w * height / h; 109 | } else if (w == h) { 110 | width = activity.Width / 2; 111 | height = width * h / w; 112 | } 113 | 114 | ImageLoaders.setsendimg(imageInfo.url, holder.showimage); 115 | holder.showimage.getLayoutParams().width = (int) width; 116 | holder.showimage.getLayoutParams().height = (int) height; 117 | holder.showimage.setOnClickListener(new SingleOnclick(position, holder.showimage, holder.allLayout)); 118 | } else if (info.data.size() > 1) { 119 | holder.showimage.setVisibility(View.GONE); 120 | holder.gridview.setVisibility(View.VISIBLE); 121 | int a = info.data.size() / 3; 122 | int b = info.data.size() % 3; 123 | if (b > 0) { 124 | a++; 125 | } 126 | float width = (activity.Width - dip2px(80) - dip2px(2)) / 3; 127 | holder.gridview.getLayoutParams().height = (int) (a * width); 128 | 129 | for (int i = 0; i < 9; i++) { 130 | holder.imgview[i].setVisibility(View.GONE); 131 | } 132 | 133 | for (int i = 0; i < info.data.size(); i++) { 134 | ImageInfo imageInfo = info.data.get(i); 135 | holder.imgview[i].setVisibility(View.VISIBLE); 136 | holder.imgview[i].getLayoutParams().width = (int) width; 137 | holder.imgview[i].getLayoutParams().height = (int) width; 138 | ImageLoaders.setsendimg(imageInfo.url, holder.imgview[i]); 139 | holder.imgview[i].setOnClickListener(new GridOnclick(position, holder.imgview[i], i, holder.gridview, holder.allLayout)); 140 | } 141 | } 142 | setContentLayout(holder.usercontent, holder.fullText); 143 | 144 | if (info.is_select) { 145 | holder.fullText.setText("收起"); 146 | holder.usercontent.setMaxLines(50); 147 | } else { 148 | holder.fullText.setText("全文"); 149 | holder.usercontent.setMaxLines(6); 150 | } 151 | 152 | holder.fullText.setOnClickListener(new fullTextOnclick(holder.usercontent, holder.fullText, position)); 153 | 154 | holder.evaluationLayout.removeAllViews(); 155 | for (int i = 0; i < info.dialogdata.size(); i++){ 156 | holder.relativeLayout = View.inflate(context, R.layout.evaluation_view, null); 157 | holder.relativeLayout.setTag( position * i+88); 158 | holder.contentText = (TextView) holder.relativeLayout.findViewById(R.id.contentText); 159 | holder.leftText = (TextView) holder.relativeLayout.findViewById(R.id.leftText); 160 | holder.defaultText = (TextView) holder.relativeLayout.findViewById(R.id.defaultText); 161 | holder.rightText = (TextView) holder.relativeLayout.findViewById(R.id.rightText); 162 | holder.contentEdit = (EditText) holder.relativeLayout.findViewById(R.id.contentEdit); 163 | holder.relativeLayout.setOnClickListener(new evaluationOnclick(position,holder.evaluationLayout,holder.allLayout)); 164 | DialogueInfo dinfo = info.dialogdata.get(i); 165 | holder.contentText.setText(dinfo.content); 166 | holder.evaluationLayout.addView(holder.relativeLayout); 167 | } 168 | 169 | 170 | 171 | holder.leftText.setOnClickListener(new NameOnclick(position + "我来")); 172 | holder.rightText.setOnClickListener(new NameOnclick(position + "你来")); 173 | 174 | return convertView; 175 | } 176 | 177 | public class ViewHolder { 178 | ImageView list_img; 179 | TextView username; 180 | TextView usercontent, fullText; 181 | GridLayout gridview; 182 | ImageView showimage; 183 | ImageView imgview[] = new ImageView[9]; 184 | LinearLayout evaluationLayout, allLayout; 185 | View relativeLayout; 186 | TextView contentText, leftText, defaultText, rightText; 187 | EditText contentEdit; 188 | } 189 | 190 | class SingleOnclick implements View.OnClickListener { 191 | 192 | private int index; 193 | private ImageView imageView; 194 | private LinearLayout allLayout; 195 | 196 | 197 | public SingleOnclick(int index, ImageView imageView, LinearLayout allLayout) { 198 | this.index = index; 199 | this.imageView = imageView; 200 | this.allLayout = allLayout; 201 | } 202 | 203 | @Override 204 | public void onClick(View v) { 205 | 206 | View c = activity.mixlist.getChildAt(0); 207 | int top = c.getTop(); 208 | int firstVisiblePosition = activity.mixlist.getFirstVisiblePosition(); 209 | 210 | float height = 0.0f; 211 | for (int i = 0; i < ((index + 1) - firstVisiblePosition); i++) { 212 | View view = activity.mixlist.getChildAt(i); 213 | height += view.getHeight(); 214 | } 215 | bdInfo.x = imageView.getLeft() + allLayout.getLeft(); 216 | bdInfo.y = imageView.getTop() + height + top + activity.mixlist.getTop() + allLayout.getTop(); 217 | bdInfo.width = imageView.getLayoutParams().width; 218 | bdInfo.height = imageView.getLayoutParams().height; 219 | Intent intent = new Intent(context, PreviewImage.class); 220 | ArrayList info = data.get(index).data; 221 | intent.putExtra("data", (Serializable) info); 222 | intent.putExtra("bdinfo", bdInfo); 223 | intent.putExtra("index", 0); 224 | intent.putExtra("type", 0); 225 | context.startActivity(intent); 226 | } 227 | } 228 | 229 | class GridOnclick implements View.OnClickListener { 230 | 231 | private int index; 232 | private int row; 233 | private ImageView imageView; 234 | private GridLayout gridLayout; 235 | private LinearLayout allLayout; 236 | 237 | public GridOnclick(int index, ImageView imageView, int row, GridLayout gridLayout, LinearLayout allLayout) { 238 | this.index = index; 239 | this.imageView = imageView; 240 | this.gridLayout = gridLayout; 241 | this.row = row; 242 | this.allLayout = allLayout; 243 | } 244 | 245 | @Override 246 | public void onClick(View v) { 247 | View c = activity.mixlist.getChildAt(0); 248 | int top = c.getTop(); 249 | int firstVisiblePosition = activity.mixlist.getFirstVisiblePosition(); 250 | float height = 0.0f; 251 | for (int i = 0; i < ((index + 1) - firstVisiblePosition); i++) { 252 | View view = activity.mixlist.getChildAt(i); 253 | height += view.getHeight(); 254 | } 255 | bdInfo.x = imageView.getLeft() + gridLayout.getLeft() + allLayout.getLeft(); 256 | bdInfo.y = allLayout.getTop() + gridLayout.getTop() + imageView.getTop() + height + top + activity.mixlist.getTop(); 257 | bdInfo.width = imageView.getLayoutParams().width; 258 | bdInfo.height = imageView.getLayoutParams().height; 259 | Intent intent = new Intent(context, PreviewImage.class); 260 | ArrayList info = data.get(index).data; 261 | intent.putExtra("data", (Serializable) info); 262 | intent.putExtra("bdinfo", bdInfo); 263 | intent.putExtra("index", row); 264 | intent.putExtra("type", 3); 265 | context.startActivity(intent); 266 | } 267 | } 268 | 269 | public int dip2px(float dpValue) { 270 | final float scale = context.getResources().getDisplayMetrics().density; 271 | return (int) (dpValue * scale + 0.5f); 272 | } 273 | 274 | class fullTextOnclick implements View.OnClickListener { 275 | 276 | private TextView usercontent; 277 | private TextView fullText; 278 | private int index; 279 | 280 | fullTextOnclick(TextView usercontent, TextView fullText, int index) { 281 | this.fullText = fullText; 282 | this.usercontent = usercontent; 283 | this.index = index; 284 | } 285 | 286 | @Override 287 | public void onClick(View v) { 288 | Mixinfo info = data.get(index); 289 | if (info.is_select) { 290 | usercontent.setMaxLines(6); 291 | fullText.setText("全文"); 292 | usercontent.invalidate(); 293 | } else { 294 | usercontent.setMaxLines(50); 295 | fullText.setText("收起"); 296 | usercontent.invalidate(); 297 | } 298 | info.is_select = !info.is_select; 299 | data.set(index, info); 300 | } 301 | } 302 | 303 | 304 | private class evaluationOnclick implements View.OnClickListener { 305 | 306 | private int index; 307 | private EditText contentEdit; 308 | private LinearLayout evaluationLayout,allLayout; 309 | 310 | evaluationOnclick(int index, LinearLayout evaluationLayout, LinearLayout allLayout) { 311 | this.index = index; 312 | this.evaluationLayout = evaluationLayout; 313 | this.allLayout = allLayout; 314 | } 315 | 316 | @Override 317 | public void onClick(View v) { 318 | contentEdit = (EditText)v.findViewById(R.id.contentEdit); 319 | contentEdit.setFocusable(true); 320 | contentEdit.requestFocus(); 321 | InputMethodManager inputManager = (InputMethodManager) contentEdit.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 322 | inputManager.showSoftInput(contentEdit, 0); 323 | final int hight = evaluationLayout.getTop()+v.getTop()+allLayout.getTop(); 324 | new Handler().postDelayed(new Runnable() { 325 | public void run() { 326 | //execute the task 327 | activity.SendContent(index,hight); 328 | } 329 | }, 200); 330 | } 331 | } 332 | 333 | ; 334 | 335 | private void setContentLayout(final TextView usercontent, 336 | final TextView fullText) { 337 | ViewTreeObserver vto = usercontent.getViewTreeObserver(); 338 | vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 339 | 340 | private boolean isInit; 341 | 342 | @Override 343 | public boolean onPreDraw() { 344 | if (isInit) { 345 | return true; 346 | } 347 | Layout layout = usercontent.getLayout(); 348 | if (layout != null) { 349 | int maxline = layout.getLineCount(); 350 | if (maxline > 6) { 351 | fullText.setVisibility(View.VISIBLE); 352 | } else { 353 | fullText.setVisibility(View.GONE); 354 | } 355 | isInit = true; 356 | } 357 | return true; 358 | } 359 | }); 360 | } 361 | 362 | class NameOnclick implements View.OnClickListener { 363 | 364 | private String name; 365 | 366 | NameOnclick(String name) { 367 | this.name = name; 368 | } 369 | 370 | @Override 371 | public void onClick(View v) { 372 | activity.showToast(name); 373 | } 374 | } 375 | 376 | 377 | 378 | } 379 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/dwcorephoto/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.dwcorephoto; 2 | 3 | import android.annotation.TargetApi; 4 | import android.graphics.Rect; 5 | import android.os.Build; 6 | import android.os.Bundle; 7 | import android.os.Handler; 8 | import android.support.v7.app.AppCompatActivity; 9 | import android.support.v7.widget.Toolbar; 10 | import android.util.DisplayMetrics; 11 | import android.view.View; 12 | import android.view.Window; 13 | import android.view.WindowManager; 14 | import android.widget.ImageView; 15 | import android.widget.RelativeLayout; 16 | import android.widget.Toast; 17 | 18 | import com.facebook.rebound.Spring; 19 | import com.facebook.rebound.SpringConfig; 20 | import com.facebook.rebound.SpringListener; 21 | import com.facebook.rebound.SpringSystem; 22 | import com.facebook.rebound.SpringUtil; 23 | import com.nineoldandroids.animation.Animator; 24 | import com.nineoldandroids.animation.AnimatorSet; 25 | import com.nineoldandroids.animation.ObjectAnimator; 26 | import com.readystatesoftware.systembartint.SystemBarTintManager; 27 | 28 | import davidwang.tm.model.ImageBDInfo; 29 | import davidwang.tm.model.ImageInfo; 30 | import davidwang.tm.tools.ImageLoaders; 31 | 32 | /** 33 | * Created by DavidWang on 15/8/31. 34 | */ 35 | public class BaseActivity extends AppCompatActivity { 36 | 37 | private Toast mToast; 38 | // 屏幕宽度 39 | public float Width; 40 | // 屏幕高度 41 | public float Height; 42 | 43 | protected ImageView showimg; 44 | 45 | public View Barview; 46 | 47 | private final Spring mSpring = SpringSystem 48 | .create() 49 | .createSpring() 50 | .addListener(new ExampleSpringListener()); 51 | 52 | private RelativeLayout MainView; 53 | 54 | protected ImageBDInfo bdInfo; 55 | protected ImageInfo imageInfo; 56 | private float size, size_h; 57 | 58 | private float img_w; 59 | private float img_h; 60 | 61 | //原图高 62 | private float y_img_h; 63 | private float x_img_w; 64 | protected float to_x = 0; 65 | protected float to_y = 0; 66 | private float tx; 67 | private float ty; 68 | private int statusBarHeight; 69 | private int titleBarHeight; 70 | 71 | 72 | @Override 73 | protected void onCreate(Bundle savedInstanceState) { 74 | super.onCreate(savedInstanceState); 75 | DisplayMetrics dm = getResources().getDisplayMetrics(); 76 | Width = dm.widthPixels; 77 | Height = dm.heightPixels; 78 | setToolbar(0xff009688); 79 | Rect frame = new Rect(); 80 | getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); 81 | statusBarHeight = frame.top; 82 | int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop(); 83 | //statusBarHeight是上面所求的状态栏的高度 84 | titleBarHeight = contentTop - statusBarHeight; 85 | } 86 | 87 | protected void setToolbar(int color) { 88 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 89 | setTranslucentStatus(true); 90 | } 91 | SystemBarTintManager tintManager = new SystemBarTintManager(this); 92 | // enable status bar tint 93 | tintManager.setStatusBarTintEnabled(true); 94 | // enable navigation bar tint 95 | tintManager.setNavigationBarTintEnabled(true); 96 | // int color = Color.argb(255, Color.red(255), Color.green(255), Color.blue(255)); 97 | tintManager.setTintColor(color); 98 | } 99 | 100 | @TargetApi(19) 101 | private void setTranslucentStatus(boolean on) { 102 | Window win = getWindow(); 103 | WindowManager.LayoutParams winParams = win.getAttributes(); 104 | final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; 105 | if (on) { 106 | winParams.flags |= bits; 107 | } else { 108 | winParams.flags &= ~bits; 109 | } 110 | win.setAttributes(winParams); 111 | } 112 | 113 | /** 114 | * 添加头部 115 | */ 116 | protected void AddToolbar() { 117 | Toolbar toolbar = (Toolbar) findViewById(R.id.id_toolbar); 118 | toolbar.setLogo(R.mipmap.ic_launcher); 119 | setSupportActionBar(toolbar); 120 | } 121 | 122 | 123 | /** 124 | * 获取资源 125 | */ 126 | protected void findID() { 127 | MainView = (RelativeLayout) findViewById(R.id.MainView); 128 | } 129 | 130 | /** 131 | * 监听 132 | */ 133 | protected void Listener() { 134 | } 135 | 136 | /** 137 | * 对传递数据处 138 | */ 139 | protected void initIntent() { 140 | 141 | } 142 | 143 | /** 144 | * 初始 145 | */ 146 | public void InData() { 147 | } 148 | 149 | /** 150 | * 显示提示信息 151 | * 152 | * @param text 提示文本 153 | */ 154 | public void showToast(String text) { 155 | if (mToast == null) { 156 | mToast = Toast.makeText(this, text, Toast.LENGTH_SHORT); 157 | } else { 158 | mToast.setText(text); 159 | mToast.setDuration(Toast.LENGTH_SHORT); 160 | } 161 | mToast.show(); 162 | } 163 | 164 | /** 165 | * 清空Toast 166 | */ 167 | public void cancelToast() { 168 | if (mToast != null) { 169 | mToast.cancel(); 170 | } 171 | } 172 | 173 | protected void getValue() { 174 | showimg = new ImageView(this); 175 | showimg.setScaleType(ImageView.ScaleType.CENTER_CROP); 176 | ImageLoaders.setsendimg(imageInfo.url, showimg); 177 | img_w = bdInfo.width; 178 | img_h = bdInfo.height; 179 | size = Width / img_w; 180 | y_img_h = imageInfo.height * Width / imageInfo.width; 181 | size_h = y_img_h / img_h; 182 | if (y_img_h > Height){ 183 | size_h = Height / img_h; 184 | x_img_w = imageInfo.width * Height / imageInfo.height; 185 | size = x_img_w / img_w; 186 | } 187 | RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams((int) bdInfo.width, (int) bdInfo.height); 188 | showimg.setLayoutParams(p); 189 | p.setMargins((int) bdInfo.x, (int) bdInfo.y, (int) (Width - (bdInfo.x + bdInfo.width)), (int) (Height - (bdInfo.y + bdInfo.height))); 190 | MainView.addView(showimg); 191 | 192 | Barview = View.inflate(this, R.layout.waiting_view, null); 193 | Barview.setVisibility(View.GONE); 194 | RelativeLayout.LayoutParams p1 = new RelativeLayout.LayoutParams((int)Width, (int)Height); 195 | Barview.setLayoutParams(p1); 196 | MainView.addView(Barview); 197 | 198 | showimg.setVisibility(View.VISIBLE); 199 | new Handler().postDelayed(new Runnable() { 200 | public void run() { 201 | setShowimage(); 202 | } 203 | }, 300); 204 | } 205 | 206 | protected void setShowimage() { 207 | if (mSpring.getEndValue() == 0) { 208 | mSpring.setSpringConfig(SpringConfig.fromOrigamiTensionAndFriction(170, 5)); 209 | tx = Width / 2 - (bdInfo.x + img_w / 2); 210 | ty = Height / 2 - (bdInfo.y + img_h / 2); 211 | MoveView(); 212 | return; 213 | } 214 | mSpring.setSpringConfig(SpringConfig.fromOrigamiTensionAndFriction(1, 5)); 215 | mSpring.setEndValue(0); 216 | new Handler().postDelayed(new Runnable() { 217 | public void run() { 218 | //execute the task 219 | MoveBackView(); 220 | } 221 | }, 300); 222 | 223 | } 224 | 225 | private class ExampleSpringListener implements SpringListener { 226 | 227 | @Override 228 | public void onSpringUpdate(Spring spring) { 229 | double CurrentValue = spring.getCurrentValue(); 230 | float mappedValue = (float) SpringUtil.mapValueFromRangeToRange(CurrentValue, 0, 1, 1, size); 231 | float mapy = (float) SpringUtil.mapValueFromRangeToRange(CurrentValue, 0, 1, 1, size_h); 232 | showimg.setScaleX(mappedValue); 233 | showimg.setScaleY(mapy); 234 | if (CurrentValue == 1) { 235 | EndSoring(); 236 | } 237 | } 238 | 239 | @Override 240 | public void onSpringAtRest(Spring spring) { 241 | 242 | } 243 | 244 | @Override 245 | public void onSpringActivate(Spring spring) { 246 | 247 | } 248 | 249 | @Override 250 | public void onSpringEndStateChange(Spring spring) { 251 | 252 | } 253 | } 254 | 255 | protected void EndSoring() { 256 | 257 | } 258 | 259 | protected void EndMove() { 260 | 261 | } 262 | 263 | @Override 264 | public void onWindowFocusChanged(boolean hasFocus) { 265 | super.onWindowFocusChanged(hasFocus); 266 | 267 | } 268 | 269 | 270 | public int dip2px(float dpValue) { 271 | final float scale = getResources().getDisplayMetrics().density; 272 | return (int) (dpValue * scale + 0.5f); 273 | } 274 | 275 | /** 276 | * 根据手机的分辨率从 px(像素) 的单位 转成为 dp 277 | */ 278 | public int px2dip(float pxValue) { 279 | final float scale = getResources().getDisplayMetrics().density; 280 | return (int) (pxValue / scale + 0.5f); 281 | } 282 | 283 | 284 | private void MoveView() { 285 | ObjectAnimator.ofFloat(MainView, "alpha", 0.8f).setDuration(0).start(); 286 | MainView.setVisibility(View.VISIBLE); 287 | AnimatorSet set = new AnimatorSet(); 288 | set.playTogether( 289 | ObjectAnimator.ofFloat(showimg, "translationX", tx).setDuration(200), 290 | ObjectAnimator.ofFloat(showimg, "translationY", ty).setDuration(200), 291 | ObjectAnimator.ofFloat(MainView, "alpha", 1).setDuration(200) 292 | 293 | ); 294 | set.addListener(new Animator.AnimatorListener() { 295 | @Override 296 | public void onAnimationStart(Animator animator) { 297 | 298 | } 299 | 300 | @Override 301 | public void onAnimationEnd(Animator animator) { 302 | if (imageInfo.hdurl == null) { 303 | showimg.setScaleType(ImageView.ScaleType.FIT_XY); 304 | mSpring.setEndValue(1); 305 | } else { 306 | HDImageChange(); 307 | } 308 | } 309 | 310 | @Override 311 | public void onAnimationCancel(Animator animator) { 312 | 313 | } 314 | 315 | @Override 316 | public void onAnimationRepeat(Animator animator) { 317 | 318 | } 319 | }); 320 | set.start(); 321 | 322 | } 323 | 324 | private void HDImageChange() { 325 | ImageLoaders.setsendimg(imageInfo.hdurl,showimg); 326 | showimg.setScaleType(ImageView.ScaleType.FIT_XY); 327 | mSpring.setEndValue(1); 328 | // ImageLoaders.sethdimg(imageInfo.hdurl, showimg, new ImageLoadingListener() { 329 | // @Override 330 | // public void onLoadingStarted(String imageUri, View view) { 331 | // //这里加载过度动画 332 | // Barview.setVisibility(View.VISIBLE); 333 | // } 334 | // 335 | // @Override 336 | // public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 337 | // //加载失败 338 | // showToast("加载失败."); 339 | // } 340 | // 341 | // @Override 342 | // public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 343 | // //加载成功 344 | // Barview.setVisibility(View.GONE); 345 | // showimg.setScaleType(ImageView.ScaleType.FIT_XY); 346 | // mSpring.setEndValue(1); 347 | // } 348 | // 349 | // @Override 350 | // public void onLoadingCancelled(String imageUri, View view) { 351 | // //取消加载 352 | // } 353 | // }); 354 | } 355 | 356 | private void MoveBackView() { 357 | AnimatorSet set = new AnimatorSet(); 358 | set.playTogether( 359 | ObjectAnimator.ofFloat(showimg, "translationX", to_x).setDuration(200), 360 | ObjectAnimator.ofFloat(showimg, "translationY", to_y).setDuration(200) 361 | ); 362 | set.addListener(new Animator.AnimatorListener() { 363 | @Override 364 | public void onAnimationStart(Animator animator) { 365 | showimg.setScaleType(ImageView.ScaleType.CENTER_CROP); 366 | } 367 | 368 | @Override 369 | public void onAnimationEnd(Animator animator) { 370 | EndMove(); 371 | } 372 | 373 | @Override 374 | public void onAnimationCancel(Animator animator) { 375 | 376 | } 377 | 378 | @Override 379 | public void onAnimationRepeat(Animator animator) { 380 | 381 | } 382 | }); 383 | set.start(); 384 | } 385 | 386 | } 387 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/dwcorephoto/BaseApplication.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.dwcorephoto; 2 | 3 | import android.app.Application; 4 | import android.content.Context; 5 | 6 | import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator; 7 | import com.nostra13.universalimageloader.core.ImageLoader; 8 | import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; 9 | import com.nostra13.universalimageloader.core.assist.QueueProcessingType; 10 | 11 | public class BaseApplication extends Application { 12 | 13 | @Override 14 | public void onCreate() { 15 | super.onCreate(); 16 | initImageLoader(getApplicationContext()); 17 | } 18 | 19 | public void initImageLoader(Context context) { 20 | // This configuration tuning is custom. You can tune every option, you 21 | // may tune some of them, 22 | // or you can create default configuration by 23 | // ImageLoaderConfiguration.createDefault(this); 24 | // method. 25 | ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder( 26 | context).threadPriority(Thread.NORM_PRIORITY - 2) 27 | .denyCacheImageMultipleSizesInMemory() 28 | .diskCacheFileNameGenerator(new Md5FileNameGenerator()) 29 | .tasksProcessingOrder(QueueProcessingType.LIFO) 30 | .memoryCacheSize(2 * 1024 * 1024) //缓存到内存的最大数据 31 | .memoryCacheSize(50 * 1024 * 1024) //设置内存缓存的大小 32 | .diskCacheFileCount(200) 33 | .writeDebugLogs() // Remove for release app 34 | .build(); 35 | // Initialize ImageLoader with configuration. 36 | ImageLoader.getInstance().init(config); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/dwcorephoto/GridViewActivity.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.dwcorephoto; 2 | 3 | import android.os.Bundle; 4 | import android.view.KeyEvent; 5 | import android.view.MenuItem; 6 | import android.widget.GridView; 7 | 8 | import java.util.ArrayList; 9 | 10 | import davidwang.tm.adapter.GridViewAdapter; 11 | import davidwang.tm.model.ImageInfo; 12 | 13 | public class GridViewActivity extends BaseActivity { 14 | 15 | public GridView gridView; 16 | private GridViewAdapter adapter; 17 | private ArrayList data; 18 | 19 | @Override 20 | protected void onCreate(Bundle savedInstanceState) { 21 | super.onCreate(savedInstanceState); 22 | setContentView(R.layout.activity_grid_view); 23 | findID(); 24 | InData(); 25 | AddToolbar(); 26 | 27 | } 28 | 29 | @Override 30 | protected void findID() { 31 | super.findID(); 32 | gridView = (GridView)findViewById(R.id.gridview); 33 | 34 | } 35 | 36 | @Override 37 | public void InData() { 38 | super.InData(); 39 | data = new ArrayList(); 40 | for (int i = 0 ; i < 5; i++) { 41 | ImageInfo model = new ImageInfo(); 42 | model.url = "http://img4q.duitang.com/uploads/item/201408/11/20140811141753_iNtAF.jpeg"; 43 | model.width = 1280; 44 | model.height = 720; 45 | data.add(model); 46 | ImageInfo model1 = new ImageInfo(); 47 | model1.url = "http://imgsrc.baidu.com/forum/pic/item/8b82b9014a90f603fa18d50f3912b31bb151edca.jpg"; 48 | model1.width = 1280; 49 | model1.height = 720; 50 | data.add(model1); 51 | ImageInfo model2 = new ImageInfo(); 52 | model2.url = "http://imgsrc.baidu.com/forum/pic/item/8e230cf3d7ca7bcb3acde5a2be096b63f724a8b2.jpg"; 53 | model2.width = 1280; 54 | model2.height = 720; 55 | data.add(model2); 56 | ImageInfo model3 = new ImageInfo(); 57 | model3.url = "http://att.bbs.duowan.com/forum/201210/20/210446opy9p5pghu015p9u.jpg"; 58 | model3.width = 1280; 59 | model3.height = 720; 60 | data.add(model3); 61 | ImageInfo model4 = new ImageInfo(); 62 | model4.url = "http://img5.duitang.com/uploads/item/201404/11/20140411214939_XswXa.jpeg"; 63 | model4.width = 1280; 64 | model4.height = 720; 65 | data.add(model4); 66 | } 67 | adapter = new GridViewAdapter(GridViewActivity.this,data); 68 | gridView.setAdapter(adapter); 69 | 70 | } 71 | 72 | 73 | @Override 74 | public boolean onOptionsItemSelected(MenuItem item) { 75 | switch (item.getItemId()) { 76 | case android.R.id.home: 77 | finish(); 78 | break; 79 | } 80 | return super.onOptionsItemSelected(item); 81 | } 82 | 83 | 84 | @Override 85 | public boolean onKeyDown(int keyCode, KeyEvent event) { 86 | return super.onKeyDown(keyCode, event); 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/dwcorephoto/ListViewActivity.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.dwcorephoto; 2 | 3 | import android.os.Bundle; 4 | import android.support.v4.view.MotionEventCompat; 5 | import android.util.Log; 6 | import android.view.MenuItem; 7 | import android.view.MotionEvent; 8 | import android.view.View; 9 | import android.widget.AbsListView; 10 | import android.widget.ListView; 11 | import android.widget.RelativeLayout; 12 | 13 | import com.nhaarman.listviewanimations.appearance.simple.SwingLeftInAnimationAdapter; 14 | 15 | import java.util.ArrayList; 16 | 17 | import davidwang.tm.adapter.ListViewAdapter; 18 | import davidwang.tm.model.ImageInfo; 19 | 20 | public class ListViewActivity extends BaseActivity implements View.OnTouchListener,AbsListView.OnScrollListener{ 21 | 22 | public ListView listView; 23 | private ListViewAdapter adapter; 24 | private ArrayList data; 25 | private RelativeLayout relative; 26 | 27 | private boolean is_top ; 28 | 29 | @Override 30 | protected void onCreate(Bundle savedInstanceState) { 31 | super.onCreate(savedInstanceState); 32 | setContentView(R.layout.activity_list_view); 33 | findID(); 34 | InData(); 35 | Listener(); 36 | AddToolbar(); 37 | 38 | 39 | 40 | } 41 | 42 | @Override 43 | protected void findID() { 44 | super.findID(); 45 | listView = (ListView)findViewById(R.id.listview); 46 | // relative = (RelativeLayout)findViewById(R.id.relative); 47 | } 48 | 49 | 50 | @Override 51 | public void InData() { 52 | super.InData(); 53 | data = new ArrayList(); 54 | for (int i = 0 ; i < 5; i++) { 55 | ImageInfo model = new ImageInfo(); 56 | model.url = "http://img4q.duitang.com/uploads/item/201408/11/20140811141753_iNtAF.jpeg"; 57 | model.width = 1280; 58 | model.height = 720; 59 | data.add(model); 60 | ImageInfo model1 = new ImageInfo(); 61 | model1.url = "http://imgsrc.baidu.com/forum/pic/item/8b82b9014a90f603fa18d50f3912b31bb151edca.jpg"; 62 | model1.width = 1280; 63 | model1.height = 720; 64 | data.add(model1); 65 | ImageInfo model2 = new ImageInfo(); 66 | model2.url = "http://imgsrc.baidu.com/forum/pic/item/8e230cf3d7ca7bcb3acde5a2be096b63f724a8b2.jpg"; 67 | model2.width = 1280; 68 | model2.height = 720; 69 | data.add(model2); 70 | ImageInfo model3 = new ImageInfo(); 71 | model3.url = "http://att.bbs.duowan.com/forum/201210/20/210446opy9p5pghu015p9u.jpg"; 72 | model3.width = 1280; 73 | model3.height = 720; 74 | data.add(model3); 75 | ImageInfo model4 = new ImageInfo(); 76 | model4.url = "http://img5.duitang.com/uploads/item/201404/11/20140411214939_XswXa.jpeg"; 77 | model4.width = 1280; 78 | model4.height = 720; 79 | data.add(model4); 80 | } 81 | adapter = new ListViewAdapter(ListViewActivity.this,data); 82 | SwingLeftInAnimationAdapter animationAdapter = new SwingLeftInAnimationAdapter(adapter); 83 | animationAdapter.setAbsListView(listView); 84 | listView.setAdapter(animationAdapter); 85 | 86 | } 87 | 88 | @Override 89 | protected void Listener() { 90 | super.Listener(); 91 | listView.setOnTouchListener(this); 92 | listView.setOnScrollListener(this); 93 | } 94 | 95 | @Override 96 | public boolean onOptionsItemSelected(MenuItem item) { 97 | switch (item.getItemId()) { 98 | case android.R.id.home: 99 | finish(); 100 | break; 101 | } 102 | return super.onOptionsItemSelected(item); 103 | } 104 | 105 | @Override 106 | public boolean onTouch(View v, MotionEvent event) { 107 | Log.e("1",event.getY()+"-Y"); 108 | int actionMasked = MotionEventCompat.getActionMasked(event); 109 | switch (actionMasked){ 110 | case MotionEvent.ACTION_DOWN: { 111 | break; 112 | } 113 | case MotionEvent.ACTION_MOVE: { 114 | break; 115 | } 116 | case MotionEvent.ACTION_UP:{ 117 | break; 118 | } 119 | } 120 | return false; 121 | } 122 | 123 | @Override 124 | public void onScrollStateChanged(AbsListView view, int scrollState) { 125 | 126 | } 127 | 128 | @Override 129 | public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 130 | if(firstVisibleItem == 0){ 131 | Log.e("log", "滑到顶部"); 132 | is_top = true; 133 | }else{ 134 | Log.e("log", "滑到中"); 135 | is_top = false; 136 | } 137 | if(visibleItemCount+firstVisibleItem==totalItemCount){ 138 | // Log.e("log", "滑到底部"); 139 | } 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/dwcorephoto/MainActivity.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.dwcorephoto; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.AdapterView; 7 | import android.widget.ListView; 8 | 9 | import java.util.ArrayList; 10 | 11 | import davidwang.tm.adapter.MainListAdapter; 12 | import davidwang.tm.model.MainInfo; 13 | 14 | public class MainActivity extends BaseActivity implements AdapterView.OnItemClickListener{ 15 | 16 | private ListView main_list; 17 | private MainListAdapter adapter; 18 | private ArrayList data; 19 | 20 | @Override 21 | protected void onCreate(Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | setContentView(R.layout.activity_main); 24 | findID(); 25 | inData(); 26 | adapter = new MainListAdapter(this,data); 27 | main_list.setAdapter(adapter); 28 | AddToolbar(); 29 | } 30 | 31 | protected void findID(){ 32 | main_list = (ListView)findViewById(R.id.main_list); 33 | main_list.setOnItemClickListener(this); 34 | } 35 | 36 | protected void inData() { 37 | data = new ArrayList(); 38 | MainInfo info = new MainInfo(); 39 | info.content = "SingleShow"; 40 | data.add(info); 41 | 42 | MainInfo info1 = new MainInfo(); 43 | info1.content = "TableViewShow"; 44 | data.add(info1); 45 | 46 | MainInfo info2 = new MainInfo(); 47 | info2.content = "CollectionShow"; 48 | data.add(info2); 49 | 50 | MainInfo info3 = new MainInfo(); 51 | info3.content = "MixShow"; 52 | data.add(info3); 53 | } 54 | 55 | @Override 56 | public void onItemClick(AdapterView parent, View view, int position, long id) { 57 | Intent intent = null; 58 | switch (position){ 59 | case 0: 60 | intent = new Intent(MainActivity.this,SingleShow.class); 61 | break; 62 | case 1: 63 | intent = new Intent(MainActivity.this,ListViewActivity .class); 64 | break; 65 | case 2: 66 | intent = new Intent(MainActivity.this,GridViewActivity.class); 67 | break; 68 | case 3: 69 | intent = new Intent(MainActivity.this,MixShowActivity.class); 70 | break; 71 | } 72 | if (intent != null) 73 | startActivity(intent); 74 | } 75 | 76 | } 77 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/dwcorephoto/MixShowActivity.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.dwcorephoto; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.os.Handler; 6 | import android.view.KeyEvent; 7 | import android.view.View; 8 | import android.view.inputmethod.InputMethodManager; 9 | import android.widget.AdapterView; 10 | import android.widget.Button; 11 | import android.widget.EditText; 12 | import android.widget.ImageView; 13 | import android.widget.RelativeLayout; 14 | 15 | import java.util.ArrayList; 16 | 17 | import davidwang.tm.adapter.MixListAdapter; 18 | import davidwang.tm.model.DialogueInfo; 19 | import davidwang.tm.model.ImageInfo; 20 | import davidwang.tm.model.Mixinfo; 21 | import davidwang.tm.view.PullToZoomListView; 22 | 23 | public class MixShowActivity extends BaseActivity implements AdapterView.OnItemClickListener, View.OnClickListener, PullToZoomListView.BackTouchEvent { 24 | 25 | public PullToZoomListView mixlist; 26 | private MixListAdapter adapterData; 27 | private ArrayList data; 28 | 29 | private RelativeLayout bottomView; 30 | private EditText editText; 31 | private Button sendBtn; 32 | private int height_top = 0; 33 | private int keyHeight = 0; 34 | private int index; 35 | 36 | 37 | @Override 38 | protected void onCreate(Bundle savedInstanceState) { 39 | super.onCreate(savedInstanceState); 40 | setContentView(R.layout.activity_mix_show); 41 | findID(); 42 | InData(); 43 | AddToolbar(); 44 | keyHeight = (int) Height / 3; 45 | } 46 | 47 | @Override 48 | protected void findID() { 49 | super.findID(); 50 | mixlist = (PullToZoomListView) findViewById(R.id.mixlist); 51 | mixlist.getHeaderView().setImageResource(R.mipmap.mixheadimg); 52 | mixlist.getHeaderView().setScaleType(ImageView.ScaleType.CENTER_CROP); 53 | mixlist.setOnItemClickListener(this); 54 | mixlist.setTouchEvent(this); 55 | bottomView = (RelativeLayout) findViewById(R.id.bottomView); 56 | editText = (EditText) findViewById(R.id.editText); 57 | sendBtn = (Button) findViewById(R.id.sendBtn); 58 | mixlist.addOnLayoutChangeListener(new LayoutChangeListener()); 59 | sendBtn.setOnClickListener(this); 60 | } 61 | 62 | @Override 63 | public void InData() { 64 | super.InData(); 65 | data = new ArrayList(); 66 | 67 | Mixinfo info1 = new Mixinfo(); 68 | info1.username = "DavidWang"; 69 | info1.userimg = "http://imgsrc.baidu.com/forum/pic/item/8b82b9014a90f603fa18d50f3912b31bb151edca.jpg"; 70 | info1.content = "这是一个单张的演示"; 71 | info1.data = AddData(1, 0); 72 | info1.dialogdata = AddDialog(); 73 | data.add(info1); 74 | 75 | Mixinfo info2 = new Mixinfo(); 76 | info2.username = "DavidWang"; 77 | info2.userimg = "http://imgsrc.baidu.com/forum/pic/item/8b82b9014a90f603fa18d50f3912b31bb151edca.jpg"; 78 | info2.content = "这是一个单张的演示"; 79 | info2.data = AddData(1, 1); 80 | info2.dialogdata = AddDialog(); 81 | data.add(info2); 82 | 83 | Mixinfo info3 = new Mixinfo(); 84 | info3.username = "DavidWang"; 85 | info3.userimg = "http://imgsrc.baidu.com/forum/pic/item/8b82b9014a90f603fa18d50f3912b31bb151edca.jpg"; 86 | info3.content = "这是一个单张的演示"; 87 | info3.data = AddData(1, 2); 88 | info3.dialogdata = AddDialog(); 89 | data.add(info3); 90 | 91 | for (int i = 2; i < 10; i++) { 92 | Mixinfo info4 = new Mixinfo(); 93 | info4.username = "DavidWang"; 94 | info4.userimg = "http://imgsrc.baidu.com/forum/pic/item/8b82b9014a90f603fa18d50f3912b31bb151edca.jpg"; 95 | info4.content = "这是" + i + "个单张的演示测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度测试字符长度"; 96 | info4.data = AddData(i, 2); 97 | info4.dialogdata = AddDialog(); 98 | data.add(info4); 99 | } 100 | 101 | adapterData = new MixListAdapter(MixShowActivity.this, data); 102 | mixlist.setAdapter(adapterData); 103 | 104 | } 105 | 106 | private ArrayList AddData(int num, int type) { 107 | ArrayList data = new ArrayList(); 108 | for (int i = 0; i < num; i++) { 109 | if (type == 0) { 110 | ImageInfo info = new ImageInfo(); 111 | info.url = "http://img4q.duitang.com/uploads/item/201408/11/20140811141753_iNtAF.jpeg"; 112 | info.width = 1280; 113 | info.height = 720; 114 | 115 | data.add(info); 116 | } else if (type == 1) { 117 | ImageInfo info = new ImageInfo(); 118 | info.url = "http://article.joyme.com/article/uploads/allimg/140812/101I01291-10.jpg"; 119 | info.width = 640; 120 | info.height = 960; 121 | data.add(info); 122 | 123 | } else { 124 | ImageInfo info = new ImageInfo(); 125 | info.url = "http://h.hiphotos.baidu.com/album/scrop%3D236%3Bq%3D90/sign=2fab0be130adcbef056a3959dc921cee/4b90f603738da977c61bb40eb151f8198618e3db.jpg"; 126 | info.width = 236; 127 | info.height = 236; 128 | data.add(info); 129 | } 130 | } 131 | return data; 132 | } 133 | 134 | private ArrayList AddDialog() { 135 | ArrayList dialogdata = new ArrayList(); 136 | DialogueInfo dinfo = new DialogueInfo(); 137 | dinfo.content = "我来回复你来:哇哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哇哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈"; 138 | dialogdata.add(dinfo); 139 | return dialogdata; 140 | } 141 | 142 | @Override 143 | public void onItemClick(AdapterView parent, View view, int position, long id) { 144 | hideEdit(); 145 | } 146 | 147 | @Override 148 | public void onClick(View v) { 149 | switch (v.getId()) { 150 | case R.id.sendBtn: 151 | String content = editText.getText().toString(); 152 | if (content.length() > 0) { 153 | DialogueInfo dinfo = new DialogueInfo(); 154 | dinfo.leftname = "我来"; 155 | dinfo.rightname = "你来"; 156 | dinfo.content = dinfo.leftname + "回复" + dinfo.rightname + ":" + content; 157 | Mixinfo minfo = data.get(index); 158 | ArrayList dialogarr = minfo.dialogdata; 159 | dialogarr.add(dinfo); 160 | adapterData.notifyDataSetChanged(); 161 | } 162 | hideEdit(); 163 | break; 164 | } 165 | } 166 | 167 | private void hideEdit() { 168 | if (bottomView.getVisibility() == View.VISIBLE) { 169 | bottomView.setVisibility(View.GONE); 170 | editText.setText(""); 171 | InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); 172 | imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); //强制隐藏键盘 173 | } 174 | } 175 | 176 | public void SendContent(final int index, final int hight) { 177 | this.index = index; 178 | bottomView.setVisibility(View.VISIBLE); 179 | editText.setFocusable(true); 180 | editText.requestFocus(); 181 | new Handler().postDelayed(new Runnable() { 182 | public void run() { 183 | View v = mixlist.getChildAt(0); 184 | int top = (v == null) ? 0 : v.getTop(); 185 | if (height_top == 0) { 186 | height_top = hight + top - dip2px(50); 187 | } 188 | mixlist.setSelectionFromTop((index + 1), height_top - hight); 189 | } 190 | }, 100); 191 | } 192 | 193 | @Override 194 | public boolean dispatchKeyEvent(KeyEvent event) { 195 | if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) { 196 | hideEdit(); 197 | return true; 198 | } 199 | return super.dispatchKeyEvent(event); 200 | } 201 | 202 | private class LayoutChangeListener implements View.OnLayoutChangeListener { 203 | @Override 204 | public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 205 | if (oldBottom != 0 && bottom != 0 && (oldBottom - bottom > keyHeight)) { 206 | //软键盘弹起 207 | } else if (oldBottom != 0 && bottom != 0 && (bottom - oldBottom > keyHeight)) { 208 | //软键盘消失 209 | bottomView.setVisibility(View.GONE); 210 | } 211 | } 212 | } 213 | 214 | @Override 215 | protected void onResume() { 216 | super.onResume(); 217 | hideEdit(); 218 | } 219 | 220 | @Override 221 | public void OnTouchEvent() { 222 | hideEdit(); 223 | } 224 | } 225 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/dwcorephoto/PreviewImage.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.dwcorephoto; 2 | 3 | import android.graphics.Bitmap; 4 | import android.os.Bundle; 5 | import android.os.Handler; 6 | import android.support.v4.view.PagerAdapter; 7 | import android.support.v4.view.ViewPager.OnPageChangeListener; 8 | import android.view.KeyEvent; 9 | import android.view.View; 10 | import android.view.ViewGroup; 11 | import android.view.ViewGroup.LayoutParams; 12 | import android.widget.ImageView; 13 | import android.widget.LinearLayout; 14 | import android.widget.RelativeLayout; 15 | 16 | import com.nostra13.universalimageloader.cache.memory.MemoryCache; 17 | import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; 18 | 19 | import java.util.ArrayList; 20 | import java.util.Collections; 21 | import java.util.LinkedList; 22 | import java.util.List; 23 | 24 | import davidwang.tm.model.ImageBDInfo; 25 | import davidwang.tm.model.ImageInfo; 26 | import davidwang.tm.tools.ImageLoaders; 27 | import davidwang.tm.view.HackyViewPager; 28 | import uk.co.senab.photoview.PhotoView; 29 | import uk.co.senab.photoview.PhotoViewAttacher.OnViewTapListener; 30 | 31 | public class PreviewImage extends BaseActivity implements OnPageChangeListener { 32 | 33 | private int index = 0; 34 | private HackyViewPager viewpager; 35 | private ArrayList ImgList; 36 | 37 | private SamplePagerAdapter pagerAdapter; 38 | private float moveheight; 39 | private int type; 40 | 41 | private LinearLayout AddLayout; 42 | private View moveView; 43 | private RelativeLayout addrelative; 44 | private boolean is_touch = false; 45 | private MemoryCache cache; 46 | 47 | @Override 48 | protected void onCreate(Bundle savedInstanceState) { 49 | // TODO Auto-generated method stub 50 | super.onCreate(savedInstanceState); 51 | setContentView(R.layout.activity_browseimage); 52 | findID(); 53 | Listener(); 54 | InData(); 55 | getValue(); 56 | setToolbar(0xff000000); 57 | AddInstructionsView(); 58 | } 59 | 60 | @Override 61 | public void findID() { 62 | // TODO Auto-generated method stub 63 | super.findID(); 64 | viewpager = (HackyViewPager) findViewById(R.id.bi_viewpager); 65 | AddLayout = (LinearLayout) findViewById(R.id.AddLayout); 66 | moveView = (View) findViewById(R.id.moveView); 67 | addrelative = (RelativeLayout) findViewById(R.id.addrelative); 68 | } 69 | 70 | @Override 71 | public void Listener() { 72 | // TODO Auto-generated method stub 73 | super.Listener(); 74 | viewpager.setOnPageChangeListener(this); 75 | } 76 | 77 | @Override 78 | public void InData() { 79 | // TODO Auto-generated method stub 80 | super.InData(); 81 | index = getIntent().getIntExtra("index", 0); 82 | type = getIntent().getIntExtra("type", 0); 83 | ImgList = (ArrayList) getIntent().getSerializableExtra("data"); 84 | imageInfo = ImgList.get(index); 85 | bdInfo = (ImageBDInfo) getIntent().getSerializableExtra("bdinfo"); 86 | pagerAdapter = new SamplePagerAdapter(); 87 | viewpager.setAdapter(pagerAdapter); 88 | viewpager.setCurrentItem(index); 89 | moveView.setX(dip2px(10) * index); 90 | if (ImgList.size() == 1) { 91 | addrelative.setVisibility(View.GONE); 92 | } 93 | if (type == 1) { 94 | moveheight = dip2px(70); 95 | } else if (type == 2) { 96 | moveheight = (Width - 3 * dip2px(2)) / 3; 97 | } else if (type == 3) { 98 | moveheight = (Width - dip2px(80) - dip2px(2)) / 3; 99 | } 100 | } 101 | 102 | @Override 103 | public void onPageScrollStateChanged(int arg0) { 104 | // TODO Auto-generated method stub 105 | } 106 | 107 | @Override 108 | public void onPageScrolled(int arg0, float arg1, int arg2) { 109 | // TODO Auto-generated method stub 110 | moveView.setX(dip2px(5) + dip2px(10) * arg0 + dip2px(10) * arg1); 111 | 112 | } 113 | 114 | @Override 115 | public void onPageSelected(int arg0) { 116 | // TODO Auto-generated method stub 117 | if (showimg == null) { 118 | return; 119 | } 120 | ImageInfo info = ImgList.get(arg0); 121 | ImageLoaders.setsendimg(info.url, showimg); 122 | if (type == 1) { 123 | int move_index = arg0 - index; 124 | to_y = move_index * moveheight; 125 | } else if (type == 2) { 126 | int a = index / 3; 127 | int b = index % 3; 128 | int a1 = arg0 / 3; 129 | int b1 = arg0 % 3; 130 | to_y = (a1 - a) * moveheight + (a1 - a) * dip2px(2); 131 | to_x = (b1 - b) * moveheight + (b1 - b) * dip2px(2); 132 | } else if (type == 3) { 133 | int a = index / 3; 134 | int b = index % 3; 135 | int a1 = arg0 / 3; 136 | int b1 = arg0 % 3; 137 | to_y = (a1 - a) * moveheight + (a1 - a) * dip2px(1); 138 | to_x = (b1 - b) * moveheight + (b1 - b) * dip2px(1); 139 | } 140 | } 141 | 142 | class SamplePagerAdapter extends PagerAdapter { 143 | 144 | @Override 145 | public int getCount() { 146 | return ImgList.size(); 147 | } 148 | 149 | @Override 150 | public View instantiateItem(ViewGroup container, int position) { 151 | PhotoView photoView = new PhotoView(container.getContext()); 152 | String path = ImgList.get(position).url; 153 | String dbpath = null; 154 | if (ImgList.get(position).hdurl != null){ 155 | dbpath = ImgList.get(position).hdurl; 156 | } 157 | ImageLoaders.setsendimg(path,photoView); 158 | if (dbpath != null){ 159 | ImageLoaders.sethdimg(dbpath,photoView,new AnimateFirstDisplayListener()); 160 | } 161 | // Now just add PhotoView to ViewPager and return it 162 | photoView.setOnViewTapListener(new OnViewTapListener() { 163 | @Override 164 | public void onViewTap(View arg0, float arg1, float arg2) { 165 | is_touch = true; 166 | viewpager.setVisibility(View.GONE); 167 | showimg.setVisibility(View.VISIBLE); 168 | setShowimage(); 169 | } 170 | }); 171 | 172 | container.addView(photoView, LayoutParams.MATCH_PARENT, 173 | LayoutParams.MATCH_PARENT); 174 | 175 | return photoView; 176 | } 177 | 178 | @Override 179 | public void destroyItem(ViewGroup container, int position, Object object) { 180 | container.removeView((View) object); 181 | } 182 | 183 | @Override 184 | public boolean isViewFromObject(View view, Object object) { 185 | return view == object; 186 | } 187 | } 188 | 189 | private class AnimateFirstDisplayListener extends 190 | SimpleImageLoadingListener { 191 | 192 | final List displayedImages = Collections 193 | .synchronizedList(new LinkedList()); 194 | 195 | @Override 196 | public void onLoadingComplete(String imageUri, View view, 197 | Bitmap loadedImage) { 198 | if (loadedImage != null) { 199 | ImageView imageView = (ImageView) view; 200 | imageView.setImageBitmap(loadedImage); 201 | boolean firstDisplay = !displayedImages.contains(imageUri); 202 | if (firstDisplay) { 203 | displayedImages.add(imageUri); 204 | } 205 | } 206 | Barview.setVisibility(View.GONE); 207 | } 208 | 209 | @Override 210 | public void onLoadingStarted(String imageUri, View view) { 211 | super.onLoadingStarted(imageUri, view); 212 | Barview.setVisibility(View.VISIBLE); 213 | } 214 | } 215 | 216 | @Override 217 | public boolean onKeyDown(int keyCode, KeyEvent event) { 218 | if (keyCode == KeyEvent.KEYCODE_BACK) { 219 | if (viewpager.getVisibility() == View.VISIBLE) { 220 | is_touch = true; 221 | viewpager.setVisibility(View.GONE); 222 | showimg.setVisibility(View.VISIBLE); 223 | setShowimage(); 224 | } 225 | } 226 | return true; 227 | } 228 | 229 | @Override 230 | protected void EndSoring() { 231 | super.EndSoring(); 232 | viewpager.setVisibility(View.VISIBLE); 233 | new Handler().postDelayed(new Runnable() { 234 | public void run() { 235 | //execute the task 236 | if (!is_touch){ 237 | showimg.setVisibility(View.GONE); 238 | } 239 | } 240 | }, 300); 241 | } 242 | 243 | @Override 244 | protected void EndMove() { 245 | super.EndMove(); 246 | finish(); 247 | } 248 | 249 | private void AddInstructionsView() { 250 | for (int i = 0; i < ImgList.size(); i++) { 251 | View addview = new View(PreviewImage.this); 252 | addview.setBackgroundColor(0xffffffff); 253 | LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(dip2px(5), dip2px(5)); 254 | addview.setLayoutParams(p); 255 | p.setMargins(dip2px(5), 0, 0, 0); 256 | AddLayout.addView(addview); 257 | } 258 | } 259 | 260 | } -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/dwcorephoto/SingleShow.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.dwcorephoto; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.view.MenuItem; 6 | import android.view.View; 7 | import android.widget.ImageView; 8 | 9 | import java.io.Serializable; 10 | import java.util.ArrayList; 11 | 12 | import davidwang.tm.model.ImageBDInfo; 13 | import davidwang.tm.model.ImageInfo; 14 | import davidwang.tm.tools.ImageLoaders; 15 | 16 | 17 | public class SingleShow extends BaseActivity implements View.OnClickListener{ 18 | 19 | 20 | private ImageView show_img; 21 | private ArrayList data; 22 | 23 | @Override 24 | protected void onCreate(Bundle savedInstanceState) { 25 | super.onCreate(savedInstanceState); 26 | setContentView(R.layout.activity_single_show); 27 | findID(); 28 | Listener(); 29 | AddToolbar(); 30 | } 31 | 32 | @Override 33 | protected void findID() { 34 | super.findID(); 35 | data = new ArrayList(); 36 | bdInfo = new ImageBDInfo(); 37 | imageInfo = new ImageInfo(); 38 | imageInfo.width = 1280; 39 | imageInfo.height = 720; 40 | imageInfo.url = "http://img4q.duitang.com/uploads/item/201408/11/20140811141753_iNtAF.jpeg"; 41 | data.add(imageInfo); 42 | show_img = (ImageView)findViewById(R.id.show_img); 43 | ImageLoaders.setsendimg(imageInfo.url, show_img); 44 | } 45 | 46 | @Override 47 | protected void Listener() { 48 | super.Listener(); 49 | show_img.setOnClickListener(this); 50 | } 51 | 52 | @Override 53 | public void onClick(View v) { 54 | switch (v.getId()){ 55 | case R.id.show_img: 56 | bdInfo.x = show_img.getLeft(); 57 | bdInfo.y = show_img.getTop(); 58 | bdInfo.width = show_img.getLayoutParams().width; 59 | bdInfo.height = show_img.getLayoutParams().height; 60 | Intent intent = new Intent(SingleShow.this, PreviewImage.class); 61 | intent.putExtra("data", (Serializable) data); 62 | intent.putExtra("bdinfo",bdInfo); 63 | intent.putExtra("index",0); 64 | startActivity(intent); 65 | break; 66 | } 67 | } 68 | 69 | @Override 70 | public boolean onOptionsItemSelected(MenuItem item) { 71 | switch (item.getItemId()) { 72 | case android.R.id.home: 73 | finish(); 74 | break; 75 | } 76 | return super.onOptionsItemSelected(item); 77 | } 78 | 79 | 80 | } 81 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/model/DialogueInfo.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.model; 2 | 3 | /** 4 | * Created by DavidWang on 16/4/28. 5 | */ 6 | public class DialogueInfo { 7 | 8 | public String leftname; 9 | public String rightname; 10 | public String content; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/model/ImageBDInfo.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.model; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * Created by DavidWang on 15/8/31. 7 | */ 8 | public class ImageBDInfo implements Serializable{ 9 | 10 | public float x; 11 | public float y; 12 | public float width; 13 | public float height; 14 | 15 | @Override 16 | public String toString() { 17 | return "ImageBDInfo{" + 18 | "x=" + x + 19 | ", y=" + y + 20 | ", width=" + width + 21 | ", height=" + height + 22 | '}'; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/model/ImageInfo.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.model; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * Created by DavidWang on 15/8/31. 7 | */ 8 | public class ImageInfo implements Serializable { 9 | 10 | public String url; 11 | //高清图 12 | public String hdurl; 13 | public float width; 14 | public float height; 15 | 16 | @Override 17 | public String toString() { 18 | return "ImageInfo{" + 19 | "url='" + url + '\'' + 20 | ", width=" + width + 21 | ", height=" + height + 22 | '}'; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/model/MainInfo.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.model; 2 | 3 | /** 4 | * Created by DavidWang on 15/8/25. 5 | */ 6 | public class MainInfo { 7 | public String content; 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/model/Mixinfo.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.model; 2 | 3 | import java.io.Serializable; 4 | import java.util.ArrayList; 5 | 6 | /** 7 | * Created by DavidWang on 15/10/9. 8 | */ 9 | public class Mixinfo implements Serializable { 10 | 11 | public String username; 12 | public String content; 13 | public String userimg; 14 | public boolean is_select = false; 15 | public ArrayList data; 16 | public ArrayList dialogdata; 17 | 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/tools/ImageLoaders.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.tools; 2 | 3 | import android.graphics.Bitmap; 4 | import android.widget.ImageView; 5 | 6 | import com.nostra13.universalimageloader.core.DisplayImageOptions; 7 | import com.nostra13.universalimageloader.core.ImageLoader; 8 | import com.nostra13.universalimageloader.core.assist.ImageScaleType; 9 | import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer; 10 | import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; 11 | 12 | public class ImageLoaders { 13 | 14 | public static DisplayImageOptions optionstop = null; 15 | public static DisplayImageOptions options = null; 16 | public static DisplayImageOptions sendoptions = null; 17 | public static DisplayImageOptions dailyfines = null; 18 | 19 | public static void setheadimg(int dis, String url, ImageView imageView) { 20 | if (options == null) { 21 | options = new DisplayImageOptions.Builder().showImageOnLoading(0) 22 | .showImageForEmptyUri(0).showImageOnFail(0) 23 | .cacheInMemory(true).cacheOnDisk(true) 24 | .considerExifParams(true) 25 | .displayer(new RoundedBitmapDisplayer(dis)).build(); 26 | } 27 | 28 | ImageLoader.getInstance().displayImage(url, imageView, options); 29 | } 30 | 31 | public static void settopimg(int dis, String url, ImageView imageView) { 32 | 33 | if (optionstop == null) { 34 | optionstop = new DisplayImageOptions.Builder() 35 | .showImageOnLoading(0).showImageForEmptyUri(0) 36 | .showImageOnFail(0) 37 | .cacheInMemory(true) 38 | .cacheOnDisk(true) 39 | .considerExifParams(true) 40 | .displayer(new RoundedBitmapDisplayer(dis)).build(); 41 | } 42 | 43 | ImageLoader.getInstance().displayImage(url, imageView, optionstop); 44 | 45 | } 46 | 47 | public static void setsendimg(String url, ImageView imageView) { 48 | if (sendoptions == null) { 49 | sendoptions = new DisplayImageOptions.Builder() 50 | .showImageOnLoading(0) 51 | .showImageForEmptyUri(0) 52 | .showImageOnFail(0) 53 | .cacheInMemory(true) 54 | .cacheOnDisk(true) 55 | .considerExifParams(true) 56 | .bitmapConfig(Bitmap.Config.RGB_565) 57 | .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) 58 | .build(); 59 | } 60 | 61 | ImageLoader.getInstance().displayImage(url, imageView, sendoptions); 62 | } 63 | 64 | public static void setdailyfineimg(String url, ImageView imageView, 65 | ImageLoadingListener listener) { 66 | if (dailyfines == null) { 67 | dailyfines = new DisplayImageOptions.Builder() 68 | .showImageOnLoading(0) 69 | .showImageForEmptyUri(0) 70 | .showImageOnFail(0) 71 | .cacheInMemory(true) 72 | // .cacheOnDisk(true) 73 | .considerExifParams(true) 74 | .bitmapConfig(Bitmap.Config.RGB_565) 75 | .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) 76 | .build(); 77 | } 78 | 79 | ImageLoader.getInstance().displayImage(url, imageView, dailyfines, 80 | listener); 81 | } 82 | 83 | public static void sethdimg(String url, ImageView imageView, 84 | ImageLoadingListener listener) { 85 | if (dailyfines == null) { 86 | dailyfines = new DisplayImageOptions.Builder() 87 | .showImageOnLoading(0) 88 | .showImageForEmptyUri(0) 89 | .showImageOnFail(0) 90 | .cacheInMemory(true) 91 | .cacheOnDisk(true) 92 | .considerExifParams(true) 93 | .bitmapConfig(Bitmap.Config.RGB_565) 94 | .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) 95 | .build(); 96 | } 97 | 98 | ImageLoader.getInstance().displayImage(url, imageView, dailyfines, 99 | listener); 100 | } 101 | 102 | } 103 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/view/HackyViewPager.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.view; 2 | 3 | import android.content.Context; 4 | import android.support.v4.view.ViewPager; 5 | import android.util.AttributeSet; 6 | import android.view.MotionEvent; 7 | 8 | /** 9 | * Found at http://stackoverflow.com/questions/7814017/is-it-possible-to-disable-scrolling-on-a-viewpager. 10 | * Convenient way to temporarily disable ViewPager navigation while interacting with ImageView. 11 | * 12 | * Julia Zudikova 13 | */ 14 | 15 | /** 16 | * Hacky fix for Issue #4 and 17 | * http://code.google.com/p/android/issues/detail?id=18990 18 | *

19 | * ScaleGestureDetector seems to mess up the touch events, which means that 20 | * ViewGroups which make use of onInterceptTouchEvent throw a lot of 21 | * IllegalArgumentException: pointerIndex out of range. 22 | *

23 | * There's not much I can do in my code for now, but we can mask the result by 24 | * just catching the problem and ignoring it. 25 | * 26 | * @author Chris Banes 27 | */ 28 | public class HackyViewPager extends ViewPager { 29 | 30 | private boolean isLocked; 31 | 32 | public HackyViewPager(Context context) { 33 | super(context); 34 | isLocked = false; 35 | } 36 | 37 | public HackyViewPager(Context context, AttributeSet attrs) { 38 | super(context, attrs); 39 | isLocked = false; 40 | } 41 | 42 | @Override 43 | public boolean onInterceptTouchEvent(MotionEvent ev) { 44 | if (!isLocked) { 45 | try { 46 | return super.onInterceptTouchEvent(ev); 47 | } catch (IllegalArgumentException e) { 48 | e.printStackTrace(); 49 | return false; 50 | } 51 | } 52 | return false; 53 | } 54 | 55 | @Override 56 | public boolean onTouchEvent(MotionEvent event) { 57 | if (!isLocked) { 58 | return super.onTouchEvent(event); 59 | } 60 | return false; 61 | } 62 | 63 | public void toggleLock() { 64 | isLocked = !isLocked; 65 | } 66 | 67 | public void setLocked(boolean isLocked) { 68 | this.isLocked = isLocked; 69 | } 70 | 71 | public boolean isLocked() { 72 | return isLocked; 73 | } 74 | 75 | } 76 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/view/KeyboardLayout.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.view; 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 DavidWang on 15/12/24. 10 | */ 11 | public class KeyboardLayout extends RelativeLayout { 12 | private static final String TAG = KeyboardLayout.class.getSimpleName(); 13 | public static final byte KEYBOARD_STATE_SHOW = -3; 14 | public static final byte KEYBOARD_STATE_HIDE = -2; 15 | public static final byte KEYBOARD_STATE_INIT = -1; 16 | private boolean mHasInit; 17 | private boolean mHasKeybord = false; 18 | private int mHeight; 19 | private onKybdsChangeListener mListener; 20 | 21 | public KeyboardLayout(Context context, AttributeSet attrs, int defStyle) { 22 | super(context, attrs, defStyle); 23 | } 24 | 25 | public KeyboardLayout(Context context, AttributeSet attrs) { 26 | super(context, attrs); 27 | } 28 | 29 | public KeyboardLayout(Context context) { 30 | super(context); 31 | } 32 | /** 33 | * set keyboard state listener 34 | */ 35 | public void setOnkbdStateListener(onKybdsChangeListener listener){ 36 | mListener = listener; 37 | } 38 | @Override 39 | protected void onLayout(boolean changed, int l, int t, int r, int b) { 40 | super.onLayout(changed, l, t, r, b); 41 | if (!mHasInit) { 42 | mHasInit = true; 43 | mHeight = b; 44 | // if (mListener != null) { 45 | // mListener.onKeyBoardStateChange(KEYBOARD_STATE_INIT); 46 | // } 47 | } else { 48 | mHeight = mHeight < b ? b : mHeight; 49 | } 50 | if (mHasInit && mHeight > b) { 51 | mHasKeybord = true; 52 | // if (mListener != null) { 53 | // mListener.onKeyBoardStateChange(KEYBOARD_STATE_SHOW); 54 | // } 55 | Log.w(TAG, "show keyboard......."); 56 | } 57 | if (mHasInit && mHasKeybord && mHeight == b) { 58 | mHasKeybord = false; 59 | if (mListener != null) { 60 | mListener.onKeyBoardStateChange(KEYBOARD_STATE_HIDE); 61 | } 62 | Log.w(TAG, "hide keyboard......."); 63 | } 64 | } 65 | 66 | @Override 67 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 68 | final int proposedHeight = MeasureSpec.getSize(heightMeasureSpec); 69 | final int actualHeight = getHeight(); 70 | 71 | if (actualHeight > proposedHeight) { 72 | if (!mHasKeybord) { 73 | mHasKeybord = true; 74 | if (mListener != null) { 75 | mListener.onKeyBoardStateChange(KEYBOARD_STATE_SHOW); 76 | } 77 | } 78 | 79 | } else { 80 | if (mHasKeybord){ 81 | // mHasKeybord = false; 82 | // if (mListener != null) { 83 | // mListener.onKeyBoardStateChange(KEYBOARD_STATE_HIDE); 84 | // } 85 | } 86 | } 87 | 88 | super.onMeasure(widthMeasureSpec, heightMeasureSpec); 89 | } 90 | 91 | public interface onKybdsChangeListener{ 92 | public void onKeyBoardStateChange(int state); 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/view/PullToZoomListView.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.view; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.os.SystemClock; 6 | import android.util.AttributeSet; 7 | import android.util.DisplayMetrics; 8 | import android.view.MotionEvent; 9 | import android.view.View; 10 | import android.view.ViewGroup; 11 | import android.view.animation.Interpolator; 12 | import android.widget.AbsListView; 13 | import android.widget.ImageView; 14 | import android.widget.ListView; 15 | import android.widget.RelativeLayout; 16 | 17 | import davidwang.tm.dwcorephoto.R; 18 | import davidwang.tm.tools.ImageLoaders; 19 | 20 | /** 21 | * Created by DavidWang on 15/10/8. 22 | */ 23 | public class PullToZoomListView extends ListView implements 24 | AbsListView.OnScrollListener { 25 | private static final int INVALID_VALUE = -1; 26 | private static final String TAG = "PullToZoomListView"; 27 | private static final Interpolator sInterpolator = new Interpolator() { 28 | public float getInterpolation(float paramAnonymousFloat) { 29 | float f = paramAnonymousFloat - 1.0F; 30 | return 1.0F + f * (f * (f * (f * f))); 31 | } 32 | }; 33 | int mActivePointerId = -1; 34 | private RelativeLayout mHeaderContainer; 35 | private int mHeaderHeight; 36 | private ImageView mHeaderImage; 37 | float mLastMotionY = -1.0F; 38 | float mLastScale = -1.0F; 39 | float mMaxScale = -1.0F; 40 | private AbsListView.OnScrollListener mOnScrollListener; 41 | private ScalingRunnalable mScalingRunnalable; 42 | private int mScreenHeight; 43 | private BackTouchEvent event; 44 | 45 | public PullToZoomListView(Context paramContext) { 46 | super(paramContext); 47 | init(paramContext); 48 | } 49 | 50 | public PullToZoomListView(Context paramContext, 51 | AttributeSet paramAttributeSet) { 52 | super(paramContext, paramAttributeSet); 53 | init(paramContext); 54 | } 55 | 56 | public PullToZoomListView(Context paramContext, 57 | AttributeSet paramAttributeSet, int paramInt) { 58 | super(paramContext, paramAttributeSet, paramInt); 59 | init(paramContext); 60 | } 61 | 62 | public void setTouchEvent(BackTouchEvent event){ 63 | this.event = event; 64 | } 65 | 66 | private void endScraling() { 67 | if (this.mHeaderContainer.getBottom() >= this.mHeaderHeight) 68 | this.mScalingRunnalable.startAnimation(200L); 69 | } 70 | 71 | private void init(Context paramContext) { 72 | DisplayMetrics localDisplayMetrics = new DisplayMetrics(); 73 | ((Activity) paramContext).getWindowManager().getDefaultDisplay() 74 | .getMetrics(localDisplayMetrics); 75 | this.mScreenHeight = localDisplayMetrics.heightPixels; 76 | 77 | this.mHeaderContainer = (RelativeLayout) View.inflate(paramContext, R.layout.mixshow_headview, null); 78 | this.mHeaderImage = (ImageView)this.mHeaderContainer.findViewById(R.id.maxshowimg); 79 | ImageView userview = (ImageView)mHeaderContainer.findViewById(R.id.userimg); 80 | // this.mHeaderImage.setBackgroundResource(R.mipmap.ic_launcher); 81 | ImageLoaders.setsendimg("http://imgsrc.baidu.com/forum/pic/item/8b82b9014a90f603fa18d50f3912b31bb151edca.jpg", userview); 82 | int i = localDisplayMetrics.widthPixels; 83 | setHeaderViewSize(i, (int) (9.0F * (i / 12.0F))); 84 | // this.mHeaderContainer.addView(this.mHeaderImage); 85 | addHeaderView(this.mHeaderContainer); 86 | this.mScalingRunnalable = new ScalingRunnalable(); 87 | super.setOnScrollListener(this); 88 | } 89 | 90 | private void onSecondaryPointerUp(MotionEvent paramMotionEvent) { 91 | int i = (paramMotionEvent.getAction()) >> 8; 92 | if (paramMotionEvent.getPointerId(i) == this.mActivePointerId) 93 | if (i != 0) { 94 | int j = 1; 95 | this.mLastMotionY = paramMotionEvent.getY(0); 96 | this.mActivePointerId = paramMotionEvent.getPointerId(0); 97 | return; 98 | } 99 | } 100 | 101 | private void reset() { 102 | this.mActivePointerId = -1; 103 | this.mLastMotionY = -1.0F; 104 | this.mMaxScale = -1.0F; 105 | this.mLastScale = -1.0F; 106 | } 107 | 108 | public ImageView getHeaderView() { 109 | return this.mHeaderImage; 110 | } 111 | 112 | public boolean onInterceptTouchEvent(MotionEvent paramMotionEvent) { 113 | return super.onInterceptTouchEvent(paramMotionEvent); 114 | } 115 | 116 | protected void onLayout(boolean paramBoolean, int paramInt1, int paramInt2, 117 | int paramInt3, int paramInt4) { 118 | super.onLayout(paramBoolean, paramInt1, paramInt2, paramInt3, paramInt4); 119 | if (this.mHeaderHeight == 0) 120 | this.mHeaderHeight = this.mHeaderContainer.getHeight(); 121 | } 122 | 123 | @Override 124 | public void onScroll(AbsListView paramAbsListView, int paramInt1, 125 | int paramInt2, int paramInt3) { 126 | float f = this.mHeaderHeight - this.mHeaderContainer.getBottom(); 127 | if ((f > 0.0F) && (f < this.mHeaderHeight)) { 128 | int i = (int) (0.65D * f); 129 | this.mHeaderImage.scrollTo(0, -i); 130 | } else if (this.mHeaderImage.getScrollY() != 0) { 131 | this.mHeaderImage.scrollTo(0, 0); 132 | } 133 | if (this.mOnScrollListener != null) { 134 | this.mOnScrollListener.onScroll(paramAbsListView, paramInt1, 135 | paramInt2, paramInt3); 136 | } 137 | } 138 | 139 | public void onScrollStateChanged(AbsListView paramAbsListView, int paramInt) { 140 | if (this.mOnScrollListener != null) 141 | this.mOnScrollListener.onScrollStateChanged(paramAbsListView, 142 | paramInt); 143 | } 144 | 145 | public boolean onTouchEvent(MotionEvent paramMotionEvent) { 146 | event.OnTouchEvent(); 147 | switch (0xFF & paramMotionEvent.getAction()) { 148 | case 4: 149 | case 0: 150 | if (!this.mScalingRunnalable.mIsFinished) { 151 | this.mScalingRunnalable.abortAnimation(); 152 | } 153 | this.mLastMotionY = paramMotionEvent.getY(); 154 | this.mActivePointerId = paramMotionEvent.getPointerId(0); 155 | this.mMaxScale = (this.mScreenHeight / this.mHeaderHeight); 156 | this.mLastScale = (this.mHeaderContainer.getBottom() / this.mHeaderHeight); 157 | break; 158 | case 2: 159 | int j = paramMotionEvent.findPointerIndex(this.mActivePointerId); 160 | if (j == -1) { 161 | } else { 162 | if (this.mLastMotionY == -1.0F) 163 | this.mLastMotionY = paramMotionEvent.getY(j); 164 | if (this.mHeaderContainer.getBottom() >= this.mHeaderHeight) { 165 | ViewGroup.LayoutParams localLayoutParams = this.mHeaderContainer 166 | .getLayoutParams(); 167 | float f = ((paramMotionEvent.getY(j) - this.mLastMotionY + this.mHeaderContainer 168 | .getBottom()) / this.mHeaderHeight - this.mLastScale) 169 | / 2.0F + this.mLastScale; 170 | if ((this.mLastScale <= 1.0D) && (f < this.mLastScale)) { 171 | localLayoutParams.height = this.mHeaderHeight; 172 | this.mHeaderContainer 173 | .setLayoutParams(localLayoutParams); 174 | return super.onTouchEvent(paramMotionEvent); 175 | } 176 | this.mLastScale = Math.min(Math.max(f, 1.0F), 177 | this.mMaxScale); 178 | localLayoutParams.height = ((int) (this.mHeaderHeight * this.mLastScale)); 179 | if (localLayoutParams.height < this.mScreenHeight) 180 | this.mHeaderContainer 181 | .setLayoutParams(localLayoutParams); 182 | this.mLastMotionY = paramMotionEvent.getY(j); 183 | return true; 184 | } 185 | this.mLastMotionY = paramMotionEvent.getY(j); 186 | } 187 | break; 188 | case 1: 189 | reset(); 190 | endScraling(); 191 | break; 192 | case 3: 193 | int i = paramMotionEvent.getActionIndex(); 194 | this.mLastMotionY = paramMotionEvent.getY(i); 195 | this.mActivePointerId = paramMotionEvent.getPointerId(i); 196 | break; 197 | case 5: 198 | onSecondaryPointerUp(paramMotionEvent); 199 | this.mLastMotionY = paramMotionEvent.getY(paramMotionEvent 200 | .findPointerIndex(this.mActivePointerId)); 201 | break; 202 | case 6: 203 | } 204 | return super.onTouchEvent(paramMotionEvent); 205 | } 206 | 207 | public void setHeaderViewSize(int paramInt1, int paramInt2) { 208 | Object localObject = this.mHeaderContainer.getLayoutParams(); 209 | if (localObject == null) 210 | localObject = new AbsListView.LayoutParams(paramInt1, paramInt2); 211 | ((ViewGroup.LayoutParams) localObject).width = paramInt1; 212 | ((ViewGroup.LayoutParams) localObject).height = paramInt2; 213 | this.mHeaderContainer 214 | .setLayoutParams((ViewGroup.LayoutParams) localObject); 215 | this.mHeaderHeight = paramInt2; 216 | } 217 | 218 | public void setOnScrollListener( 219 | AbsListView.OnScrollListener paramOnScrollListener) { 220 | this.mOnScrollListener = paramOnScrollListener; 221 | } 222 | 223 | // public void setShadow(int paramInt) { 224 | // this.mShadow.setBackgroundResource(paramInt); 225 | // } 226 | 227 | class ScalingRunnalable implements Runnable { 228 | long mDuration; 229 | boolean mIsFinished = true; 230 | float mScale; 231 | long mStartTime; 232 | 233 | ScalingRunnalable() { 234 | } 235 | 236 | public void abortAnimation() { 237 | this.mIsFinished = true; 238 | } 239 | 240 | public boolean isFinished() { 241 | return this.mIsFinished; 242 | } 243 | 244 | public void run() { 245 | float f2; 246 | ViewGroup.LayoutParams localLayoutParams; 247 | if ((!this.mIsFinished) && (this.mScale > 1.0D)) { 248 | float f1 = ((float) SystemClock.currentThreadTimeMillis() - (float) this.mStartTime) 249 | / (float) this.mDuration; 250 | f2 = this.mScale - (this.mScale - 1.0F) 251 | * PullToZoomListView.sInterpolator.getInterpolation(f1); 252 | localLayoutParams = PullToZoomListView.this.mHeaderContainer 253 | .getLayoutParams(); 254 | if (f2 > 1.0F) { 255 | localLayoutParams.height = PullToZoomListView.this.mHeaderHeight; 256 | localLayoutParams.height = ((int) (f2 * PullToZoomListView.this.mHeaderHeight)); 257 | PullToZoomListView.this.mHeaderContainer 258 | .setLayoutParams(localLayoutParams); 259 | PullToZoomListView.this.post(this); 260 | return; 261 | } 262 | this.mIsFinished = true; 263 | } 264 | } 265 | 266 | public void startAnimation(long paramLong) { 267 | this.mStartTime = SystemClock.currentThreadTimeMillis(); 268 | this.mDuration = paramLong; 269 | this.mScale = ((float) (PullToZoomListView.this.mHeaderContainer 270 | .getBottom()) / PullToZoomListView.this.mHeaderHeight); 271 | this.mIsFinished = false; 272 | PullToZoomListView.this.post(this); 273 | } 274 | } 275 | 276 | public interface BackTouchEvent { 277 | /** 278 | * @return whether the adapter was set or not. 279 | */ 280 | public void OnTouchEvent(); 281 | } 282 | } 283 | -------------------------------------------------------------------------------- /app/src/main/java/davidwang/tm/view/SquareLayout.java: -------------------------------------------------------------------------------- 1 | package davidwang.tm.view; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.widget.RelativeLayout; 6 | 7 | /** 8 | * Created by DavidWang on 15/9/6. 9 | */ 10 | public class SquareLayout extends RelativeLayout { 11 | 12 | public SquareLayout(Context context, AttributeSet attrs, int defStyle) { 13 | super(context, attrs, defStyle); 14 | } 15 | 16 | public SquareLayout(Context context, AttributeSet attrs) { 17 | super(context, attrs); 18 | } 19 | 20 | public SquareLayout(Context context) { 21 | super(context); 22 | } 23 | 24 | @SuppressWarnings("unused") 25 | @Override 26 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 27 | // For simple implementation, or internal size is always 0. 28 | // We depend on the container to specify the layout size of 29 | // our view. We can't really know what it is since we will be 30 | // adding and removing different arbitrary views and do not 31 | // want the layout to change as this happens. 32 | setMeasuredDimension(getDefaultSize(0, widthMeasureSpec), getDefaultSize(0, heightMeasureSpec)); 33 | 34 | // Children are just made to fill our space. 35 | int childWidthSize = getMeasuredWidth(); 36 | int childHeightSize = getMeasuredHeight(); 37 | //高度和宽度一样 38 | heightMeasureSpec = widthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidthSize, MeasureSpec.EXACTLY); 39 | super.onMeasure(widthMeasureSpec, heightMeasureSpec); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/click_content.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_browseimage.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 14 | 15 | 16 | 17 | 25 | 30 | 31 | 32 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_grid_view.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 15 | 16 | 17 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_list_view.xml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 17 | 18 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 11 | 12 | 18 | 19 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_mix_show.xml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 18 | 19 | 30 | 31 | 32 | 39 | 40 | 52 | 53 |