android UI 仿 win 8 模块化 标题,并实现 可长按拖动交换图片位置、可点击,且伴随动画特效

简介: 转载请声明出处,谢谢!http://www.cnblogs.com/linguanh/ 先上效果图,给大家个直观效果,后上实现代码:  ->  ->->    ok,现在简单说下我上面的图片被做了什么操作,长按“休闲场所”,然后代码实现 震动,告诉用户,现在可以移动了,然后我把它和“海滨沿岸” 互换位置,注意此时的 图片是 半透明的,这些都是自定义特效,可以任意改。

转载请声明出处,谢谢!http://www.cnblogs.com/linguanh/

先上效果图,给大家个直观效果,后上实现代码:

 ->  ->-> 

 

ok,现在简单说下我上面的图片被做了什么操作,长按“休闲场所”,然后代码实现 震动,告诉用户,现在可以移动了,然后我把它和“海滨沿岸” 互换位置,注意此时的 图片是 半透明的,这些都是自定义特效,可以任意改。

 

代码来了:

      这里我先给出,布局文件不含(ViewPager),这个根据个人修改的。

  1 <?xml version="1.0" encoding="utf-8"?>
  2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3     android:layout_width="fill_parent"
  4     android:layout_height="fill_parent"
  5     android:orientation="horizontal"
  6     android:background="@color/common_bg"
  7     >
  8     <LinearLayout
  9         android:id="@+id/ll"
 10         android:layout_width="wrap_content"
 11         android:layout_height="wrap_content"
 12         android:orientation="vertical"
 13         android:layout_centerInParent="true">
 14         <LinearLayout
 15             android:layout_width="fill_parent"
 16             android:layout_height="wrap_content"
 17             android:orientation="horizontal">
 18             <RelativeLayout
 19                 android:id="@+id/rl1"
 20                 android:layout_width="160dp"
 21                 android:layout_height="160dp"
 22                 android:clickable="true"
 23                 android:background="@drawable/one">
 24                 <ImageView
 25                     android:id="@+id/img1"
 26                     android:layout_width="fill_parent"
 27                     android:layout_height="fill_parent"
 28                     android:layout_margin="30dp"
 29                     android:contentDescription="@string/hello"/>
 30                 <RelativeLayout
 31                     android:alpha="0.4"
 32                     android:background="#000000"
 33                     android:layout_width="wrap_content"
 34                     android:layout_alignParentBottom="true"
 35                     android:layout_alignParentRight="true"
 36                     android:layout_height="20dp">
 37                     <TextView
 38                         android:id="@+id/tv1"
 39                         android:alpha="1"
 40                         android:layout_width="wrap_content"
 41                         android:layout_height="wrap_content"
 42                         android:layout_alignParentBottom="true"
 43                         android:textColor="@color/white"
 44                         android:textSize="@dimen/text_normal_size"
 45                         android:singleLine="true"
 46                         android:layout_alignParentRight="true"/>
 47                 </RelativeLayout>
 48             </RelativeLayout>
 49             <RelativeLayout
 50                 android:id="@+id/rl2"
 51                 android:layout_width="160dp"
 52                 android:layout_height="160dp"
 53                 android:layout_marginLeft="5dp"
 54                 android:clickable="true"
 55                 android:background="@drawable/two">
 56                 <ImageView
 57                     android:id="@+id/img2"
 58                     android:layout_width="fill_parent"
 59                     android:layout_height="fill_parent"
 60                     android:layout_margin="30dp"
 61                     android:contentDescription="@string/hello"/>
 62                 <RelativeLayout
 63                     android:alpha="0.4"
 64                     android:background="#000000"
 65                     android:layout_width="wrap_content"
 66                     android:layout_alignParentBottom="true"
 67                     android:layout_alignParentRight="true"
 68                     android:layout_height="20dp">
 69                     <TextView
 70                         android:id="@+id/tv2"
 71                         android:layout_width="wrap_content"
 72                         android:layout_height="wrap_content"
 73                         android:layout_alignParentBottom="true"
 74                         android:textColor="@color/white"
 75                         android:textSize="@dimen/text_normal_size"
 76                         android:singleLine="true"
 77                         android:layout_alignParentRight="true"/>
 78                 </RelativeLayout>
 79             </RelativeLayout>
 80         </LinearLayout>
 81 
 82         <LinearLayout
 83             android:layout_width="fill_parent"
 84             android:layout_height="wrap_content"
 85             android:layout_marginTop="5dp"
 86             android:orientation="horizontal">
 87             <RelativeLayout
 88                 android:id="@+id/rl3"
 89                 android:layout_width="160dp"
 90                 android:layout_height="160dp"
 91                 android:clickable="true"
 92                 android:background="@drawable/three">
 93                 <ImageView
 94                     android:id="@+id/img3"
 95                     android:layout_width="fill_parent"
 96                     android:layout_height="fill_parent"
 97                     android:layout_margin="30dp"
 98                     android:contentDescription="@string/hello"/>
 99                 <RelativeLayout
100                     android:alpha="0.4"
101                     android:background="#000000"
102                     android:layout_width="wrap_content"
103                     android:layout_alignParentBottom="true"
104                     android:layout_alignParentRight="true"
105                     android:layout_height="20dp">
106                     <TextView
107                         android:id="@+id/tv3"
108                         android:layout_width="wrap_content"
109                         android:layout_height="wrap_content"
110                         android:layout_alignParentBottom="true"
111                         android:textColor="@color/white"
112                         android:textSize="@dimen/text_normal_size"
113                         android:singleLine="true"
114                         android:layout_alignParentRight="true"/>
115                 </RelativeLayout>
116             </RelativeLayout>
117 
118             <RelativeLayout
119                 android:id="@+id/rl4"
120                 android:layout_width="160dp"
121                 android:layout_height="160dp"
122                 android:layout_marginLeft="5dp"
123                 android:clickable="true"
124                 android:background="@drawable/four">
125                 <ImageView
126                     android:id="@+id/img4"
127                     android:layout_width="fill_parent"
128                     android:layout_height="fill_parent"
129                     android:layout_margin="30dp"
130                     android:contentDescription="@string/hello"/>
131                 <RelativeLayout
132                     android:alpha="0.4"
133                     android:background="#000000"
134                     android:layout_width="wrap_content"
135                     android:layout_alignParentBottom="true"
136                     android:layout_alignParentRight="true"
137                     android:layout_height="20dp">
138                     <TextView
139                         android:id="@+id/tv4"
140                         android:layout_width="wrap_content"
141                         android:layout_height="wrap_content"
142                         android:layout_alignParentBottom="true"
143                         android:textColor="@color/white"
144                         android:textSize="@dimen/text_normal_size"
145                         android:singleLine="true"
146                         android:layout_alignParentRight="true"/>
147                 </RelativeLayout>
148             </RelativeLayout>
149         </LinearLayout>
150 
151         <LinearLayout
152             android:layout_width="fill_parent"
153             android:layout_height="wrap_content"
154             android:layout_marginTop="5dp"
155             android:orientation="horizontal">
156             <RelativeLayout
157                 android:id="@+id/rl5"
158                 android:layout_width="160dp"
159                 android:layout_height="160dp"
160                 android:clickable="true"
161                 android:background="@drawable/backg">
162                 <ImageView
163                     android:id="@+id/img5"
164                     android:layout_width="fill_parent"
165                     android:layout_height="fill_parent"
166                     android:layout_margin="30dp"
167                     android:contentDescription="@string/hello"/>
168                 <RelativeLayout
169                     android:alpha="0.4"
170                     android:background="#000000"
171                     android:layout_width="wrap_content"
172                     android:layout_alignParentBottom="true"
173                     android:layout_alignParentRight="true"
174                     android:layout_height="20dp">
175                     <TextView
176                         android:id="@+id/tv5"
177                         android:layout_width="wrap_content"
178                         android:layout_height="wrap_content"
179                         android:layout_alignParentBottom="true"
180                         android:textColor="@color/white"
181                         android:textSize="@dimen/text_normal_size"
182                         android:singleLine="true"
183                         android:layout_alignParentRight="true"/>
184                 </RelativeLayout>
185             </RelativeLayout>
186             <RelativeLayout
187                 android:id="@+id/rl6"
188                 android:layout_width="160dp"
189                 android:layout_height="160dp"
190                 android:layout_marginLeft="5dp">
191                 <RelativeLayout
192                     android:id="@+id/rl7"
193                     android:layout_width="fill_parent"
194                     android:layout_height="60dp"
195                     android:layout_marginBottom="5dp"
196                     android:clickable="true"
197                     android:background="@drawable/five">
198                     <ImageView
199                         android:id="@+id/img7"
200                         android:layout_width="36dp"
201                         android:layout_height="36dp"
202                         android:layout_centerVertical="true"
203                         android:layout_alignParentLeft="true"
204                         android:layout_marginLeft="10dp"
205                         android:contentDescription="@string/hello"/>
206                     <RelativeLayout
207                         android:alpha="0.4"
208                         android:background="#000000"
209                         android:layout_width="wrap_content"
210                         android:layout_alignParentBottom="true"
211                         android:layout_alignParentRight="true"
212                         android:layout_height="20dp">
213                         <TextView
214                             android:id="@+id/tv7"
215                             android:layout_width="wrap_content"
216                             android:layout_height="wrap_content"
217                             android:layout_alignParentBottom="true"
218                             android:textColor="@color/white"
219                             android:textSize="@dimen/text_normal_size"
220                             android:singleLine="true"
221                             android:layout_alignParentRight="true"/>
222                     </RelativeLayout>
223                 </RelativeLayout>
224                 <RelativeLayout
225                     android:id="@+id/rl8"
226                     android:layout_width="80dp"
227                     android:layout_height="wrap_content"
228                     android:layout_below="@id/rl7"
229                     android:layout_alignParentLeft="true"
230                     android:clickable="true"
231                     android:background="@drawable/six">
232                     <ImageView
233                         android:id="@+id/img8"
234                         android:layout_width="36dp"
235                         android:layout_height="36dp"
236                         android:layout_centerInParent="true"
237                         android:contentDescription="@string/hello"/>
238                     <RelativeLayout
239                         android:alpha="0.4"
240                         android:background="#000000"
241                         android:layout_width="wrap_content"
242                         android:layout_alignParentBottom="true"
243                         android:layout_alignParentRight="true"
244                         android:layout_height="20dp">
245                         <TextView
246                             android:id="@+id/tv8"
247                             android:layout_width="wrap_content"
248                             android:layout_height="wrap_content"
249                             android:layout_alignParentBottom="true"
250                             android:textColor="@color/white"
251                             android:textSize="@dimen/text_little_size"
252                             android:singleLine="true"
253                             android:layout_alignParentRight="true"/>
254                     </RelativeLayout>
255                 </RelativeLayout>
256 
257                 <RelativeLayout
258                     android:id="@+id/rl9"
259                     android:layout_width="75dp"
260                     android:layout_height="wrap_content"
261                     android:layout_below="@id/rl7"
262                     android:layout_alignParentRight="true"
263                     android:clickable="true"
264                     android:background="@drawable/seven">
265                     <ImageView
266                         android:id="@+id/img9"
267                         android:layout_width="36dp"
268                         android:layout_height="36dp"
269                         android:layout_centerInParent="true"
270                         android:contentDescription="@string/hello"/>
271                     <RelativeLayout
272                         android:alpha="0.4"
273                         android:background="#000000"
274                         android:layout_width="wrap_content"
275                         android:layout_alignParentBottom="true"
276                         android:layout_alignParentRight="true"
277                         android:layout_height="20dp">
278                         <TextView
279                             android:id="@+id/tv9"
280                             android:layout_width="wrap_content"
281                             android:layout_height="wrap_content"
282                             android:layout_alignParentBottom="true"
283                             android:textColor="@color/white"
284                             android:textSize="@dimen/text_little_size"
285                             android:singleLine="true"
286                             android:layout_alignParentRight="true"/>
287                     </RelativeLayout>
288                 </RelativeLayout>
289             </RelativeLayout>
290         </LinearLayout>
291     </LinearLayout>
292 </RelativeLayout>

 

这里再给出,里面的动画xml,可能有读者会需要到

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <set xmlns:android="http://schemas.android.com/apk/res/android" >
 3     <alpha
 4         android:interpolator="@android:anim/linear_interpolator" 
 5         android:fromAlpha="1.0"
 6         android:toAlpha="0.1"
 7         android:duration="500"
 8         android:repeatCount="1"
 9         android:repeatMode="reverse"
10         />
11     <scale 
12         android:fromXScale="1.0" 
13         android:toXScale="0.8"
14         android:fromYScale="1.0" 
15         android:toYScale="0.8" 
16         android:pivotX="50%"
17         android:pivotY="50%" 
18         android:duration="500" 
19         android:repeatCount="1"
20         android:repeatMode="reverse"
21         android:interpolator="@android:anim/linear_interpolator" 
22         />
23 </set>

 

 

java代码:

      使用前需要知道,由于我是把这个页面 装载 在 viewPager 里面的,它是一个 fragment,本身 viewPager 有 onTouchEvent 事件,即可以左右侧滑,所以,当我在 这个页面里,长按图片试图拖动它的时候,就会造成 viewPager 和 子页面 长按滑动 冲突问题,嗯,是的。不过我已经把这个问题解决了,方法请见我的另外一篇博文链接http://www.cnblogs.com/linguanh/p/4540099.html

      

       代码里面一些必要的注释,我已详细给出,相信能帮助大家理解。

  1 package com.LGH.weixin;
  2 
  3 import android.app.Activity;
  4 import android.content.Context;
  5 import android.content.Intent;
  6 import android.content.SharedPreferences;
  7 import android.graphics.Bitmap;
  8 import android.graphics.drawable.Drawable;
  9 import android.os.Bundle;
 10 import android.support.v4.app.Fragment;
 11 import android.util.DisplayMetrics;
 12 import android.util.Log;
 13 import android.view.Gravity;
 14 import android.view.LayoutInflater;
 15 import android.view.MenuItem;
 16 import android.view.MotionEvent;
 17 import android.view.View;
 18 import android.view.View.OnClickListener;
 19 import android.view.View.OnLongClickListener;
 20 import android.view.View.OnTouchListener;
 21 import android.view.ViewGroup;
 22 import android.view.WindowManager;
 23 import android.view.animation.Animation;
 24 import android.view.animation.AnimationUtils;
 25 import android.widget.ImageView;
 26 import android.widget.RelativeLayout;
 27 import android.widget.TextView;
 28 import android.widget.Toast;
 29 
 30 /**
 31  * Created by Administrator on 2015/5/25.
 32  */
 33 public class apartFragment extends Fragment implements OnTouchListener, OnClickListener, OnLongClickListener, Animation.AnimationListener{
 34 
 35     View main;
 36     View mainActivity;//为了改变 主页面的viewPager 而设置
 37 
 38     myViewPager temp;
 39     Activity myActivity = new Activity();
 40     //MainActivity in_order_to_forbid_viewPager_slip = new MainActivity();
 41 
 42     private WindowManager windowManager;
 43     private WindowManager.LayoutParams    windowParams;
 44     private View animationView; //当前单次点击播放动画的 view
 45 
 46     public static int displayWidth;  //屏幕宽度
 47     public static int displayHeight; //屏幕高度
 48 
 49     // 标志长按控件动作是否激活
 50     private boolean isMove = false;
 51     private boolean isAnimotionFinish = false;
 52 
 53     private ImageView dragImageView;        // 被拖动控件的preview
 54     private int            fromPoint = -1;//记录被拖动的View
 55     private int            toPoint = -1;//记录停止拖动时被碰撞的View
 56     private Drawable temp_img;//缓存被拖动控件的ImageView的内容
 57     private Drawable    temp_view_img;//缓存被拖动控件的 View的内容
 58     private Drawable    temp_view_img_topoint;//缓存被拖动控件 经过 的 View的内容
 59     private int[] relativeLayout_bgs = //最终只能通过它来解决 在拖动小图经过大图过程中,经过的大图被失真的问题
 60             new int[]{R.drawable.one,R.drawable.two,R.drawable.three,R.drawable.four,R.drawable.backg,R.drawable.five,R.drawable.six,R.drawable.seven};
 61 
 62     private String        temp_str;//缓存被拖动控件的TextView的内容
 63 
 64     //移动的位置
 65     private int                            dragPointX;
 66     private int                            dragPointY;
 67     //当前位置距离边界的位置
 68     private int                            dragOffsetX;
 69     private int                            dragOffsetY;
 70     private int x, y;
 71     //用于循环碰撞的数组
 72     private View[] views = new View[8];
 73     private TextView[] tvs = new TextView[8];
 74     private ImageView[] ivs = new ImageView[8];
 75     //用来显示经纬度、发包数
 76     private TextView bottom_bar_up, bottom_bar_down;
 77     //用于记录碰撞的面积
 78     //图标出现和消失的过度动画
 79     private Animation flash;
 80     //    private Animation disappear;
 81     private Animation blink;
 82     private Animation original;
 83     /*
 84      * 用于记录所有View的坐标的二位数组
 85      * points[0][0]用于记录左上角的X
 86      * points[0][1]用于记录左上角的Y
 87      * points[0][2]用于记录右下角的X
 88      * points[0][3]用于记录右下角的Y
 89      */
 90     private int[][] points = new int[8][4];
 91 
 92     @Override
 93     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 94         main = inflater.inflate(R.layout.apart_center,container,false);
 95         mainActivity = inflater.inflate(R.layout.activity_main,container,false);
 96 
 97         myActivity = getActivity();
 98 
 99         //temp = (myViewPager) mainActivity.findViewById(R.id.vp);
100         //temp = in_order_to_forbid_viewPager_slip.getVP();
101         //temp.requestDisallowInterceptTouchEvent(true);
102         //temp.setStopViewPagerSlip(false);
103 
104         initView(main);//初始化页面
105 
106         for(int i = 0; i < views.length; i++){
107             views[i].setOnClickListener(this);//绑定点击(短按)监听器
108             views[i].setOnLongClickListener(this);//绑定长按监听器
109             views[i].setOnTouchListener(this);//绑定触摸监听器
110         }
111         flash = AnimationUtils.loadAnimation(getActivity(), R.anim.flash); //自定义缩放动画
112         //disappear = AnimationUtils.loadAnimation(this, R.anim.disappear);
113         blink = AnimationUtils.loadAnimation(getActivity(), R.anim.blink);
114         original = AnimationUtils.loadAnimation(getActivity(), R.anim.original);
115 
116         return main;
117 
118     }
119 
120 
121 
122     //触摸监听器
123 
124     @Override
125     public boolean onTouch(View v, MotionEvent event) {
126         // TODO Auto-generated method stub
127         x = (int) event.getX();
128         y = (int) event.getY();
129         switch(event.getAction()){
130             case MotionEvent.ACTION_DOWN:
131                 if(points[0][0] == 0){
132                     initPoints();
133                 }
134                 break;
135             case MotionEvent.ACTION_MOVE:
136 
137                 if(isMove){
138                     if(dragImageView == null){
139 
140                         dragPointX = x;
141                         dragPointY = y;
142                         dragOffsetX = (int)event.getRawX() - x;
143                         dragOffsetY = (int)event.getRawY() - y;
144                         //移动细节的 logcat 记录
145                         Log.v("getX", String.valueOf(x) + "=====" + String.valueOf(event.getX()));
146                         Log.v("getY", String.valueOf(y) + "=====" + String.valueOf(event.getY()));
147                         Log.v("getLeft", String.valueOf(v.getLeft()) + "=====" + String.valueOf(event.getX()-v.getLeft()));
148                         Log.v("getgetTop", String.valueOf(v.getTop()) + "=====" + String.valueOf(event.getY()-v.getTop()));
149                         Log.v("getRawX", String.valueOf(event.getRawX()) + "=====" + String.valueOf(event.getRawX() - event.getX()));
150                         Log.v("getRawY", String.valueOf(event.getRawY()) + "=====" + String.valueOf(event.getRawY() - event.getY()));
151 
152                         v.destroyDrawingCache();
153                         v.setDrawingCacheEnabled(true);
154                         v.setDrawingCacheBackgroundColor(0x000000);
155                         Bitmap bm = Bitmap.createBitmap(v.getDrawingCache(true));
156                         Bitmap bitmap = Bitmap.createBitmap(bm, 8, 8, bm.getWidth()-8, bm.getHeight()-8);
157                         startDrag(bitmap, x, y); //实时生成 拖动效果,参数一是 当前图片,x y为目标标
158 //                        v.startAnimation(blink);
159                         v.setVisibility(View.INVISIBLE);//隐藏当前被长按的控件
160                         Log.v("OnTouch>>>>", "===隐藏!!!");
161                     }else{
162                         onDrag(x, y);
163                         hide();
164                         Log.v("OnTouch>>>>", "===动了!!!");
165                     }
166                 }else{
167                     Log.v("OnTouch>>>>", "===不移动");
168                 }
169                 break;
170             case MotionEvent.ACTION_UP:
171                 //if(!isMove){ //
172 
173                 //}
174                 isMove = false;
175                 stopDrag();
176 //                fromPoint = -1;
177 //                toPoint = -1;
178                 show();
179                 exchange();
180 
181 
182                 break;
183         }
184         return false;
185     }
186     /**
187      * 长按监听器
188      */
189     @Override
190     public boolean onLongClick(View v) {
191         // TODO Auto-generated method stub
192         Log.v("onLongClick>>>>>", "LongClick");
193         for(int i = 0; i < views.length; i ++){
194             if(v.equals(views[i])){
195                 fromPoint = i;
196                 isMove = true;
197                 getZhenDong.Vibrate(getActivity(), 100);//震动提醒
198 
199                 //temp.requestDisallowInterceptTouchEvent(true); //这个阻止申请的函数必须放在 onTouchListener 里面
200                 // 在 该 fragment 长按,先去掉 viewPager 的侧滑,防止冲突
201                 // requestDisallowInterceptTouchEvent(true); 在主页面可以实现,在这里还是不行,妈的
202                 main.getParent().requestDisallowInterceptTouchEvent(true); //终于!!!,这样可以
203 
204                 //temp.setStopViewPagerSlip(false);//这样也是不行,fuck the dog !
205 
206                 temp_img = ivs[i].getDrawable();//初始化被拖动的View的 ImageView的缓存
207                 temp_view_img = views[i].getBackground();
208                 temp_str = tvs[i].getText().toString();//初始化被拖动的View的TextView的缓存
209 
210                 return true;
211             }
212         }
213         return true;
214     }
215     /**
216      * 短按监听器
217      */
218     @Override
219     public void onClick(View v) {
220         // TODO Auto-generated method stub
221         animationView = v;
222         Animation temp = AnimationUtils.loadAnimation(getActivity(), R.anim.flash);
223         v.startAnimation(temp); //设置单点 时播放缩放动画
224         for(int i = 0; i < views.length; i++){
225             views[i].setOnClickListener(null);//一次点击后,移除所有的监听事件
226         }
227         temp.setAnimationListener(this);
228         //跳转 操作 放置 动画 播放完毕的 监听里面,实现 播放完 动画 再 跳转
229 
230     }
231     @Override
232     public void onAnimationStart(Animation animation) {
233         if (isAnimotionFinish) {
234             isAnimotionFinish = false;
235         }
236     }
237 
238     @Override
239     public void onAnimationEnd(Animation animation) {
240         isAnimotionFinish = true;
241         for (int i = 0; i < views.length; i++) {
242             views[i].setOnClickListener(this);//恢复监听
243         }
244         Toast.makeText(getActivity(), "finish animation", Toast.LENGTH_LONG).show();
245         for (int i = 0; i < views.length; i++) {
246             Intent readToJump = new Intent(myActivity,infoMain.class);
247             startActivity(readToJump);
248         }
249     }
250 
251     @Override
252     public void onAnimationRepeat(Animation animation) {
253 
254     }
255 
256     /**
257      * 初始化页面所有控件
258      */
259     private void initView(View view){
260 
261         //获取屏幕分辨率
262         DisplayMetrics displayMetrics = new DisplayMetrics();
263         myActivity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
264         displayWidth = displayMetrics.widthPixels;
265         displayHeight = displayMetrics.heightPixels;
266         //-------------下面的 ImageView 已被我 废弃,大家可以 根据自己需求,使用它 -------------
267 
268         views[0] = (RelativeLayout) view.findViewById(R.id.rl1);
269         tvs[0] = (TextView) view.findViewById(R.id.tv1);
270         ivs[0] = (ImageView) view.findViewById(R.id.img1);
271 
272         views[1] = (RelativeLayout) view.findViewById(R.id.rl2);
273         tvs[1] = (TextView) view.findViewById(R.id.tv2);
274         ivs[1] = (ImageView) view.findViewById(R.id.img2);
275 
276         views[2] = (RelativeLayout) view.findViewById(R.id.rl3);
277         tvs[2] = (TextView) view.findViewById(R.id.tv3);
278         ivs[2] = (ImageView) view.findViewById(R.id.img3);
279 
280         views[3] = (RelativeLayout) view.findViewById(R.id.rl4);
281         tvs[3] = (TextView) view.findViewById(R.id.tv4);
282         ivs[3] = (ImageView) view.findViewById(R.id.img4);
283 
284         views[4] = (RelativeLayout) view.findViewById(R.id.rl5);
285         tvs[4] = (TextView) view.findViewById(R.id.tv5);
286         ivs[4] = (ImageView) view.findViewById(R.id.img5);
287 
288         views[5] = (RelativeLayout) view.findViewById(R.id.rl7);//1/2大小的relativelayout
289         tvs[5] = (TextView) view.findViewById(R.id.tv7);
290         ivs[5] = (ImageView) view.findViewById(R.id.img7);
291 
292         views[6] = (RelativeLayout) view.findViewById(R.id.rl8);//1/4大小的relativelayout
293         tvs[6] = (TextView) view.findViewById(R.id.tv8);
294         ivs[6] = (ImageView) view.findViewById(R.id.img8);
295 
296         views[7] = (RelativeLayout) view.findViewById(R.id.rl9);//1/4大小的relativelayout
297         tvs[7] = (TextView) view.findViewById(R.id.tv9);
298         ivs[7] = (ImageView) view.findViewById(R.id.img9);
299 
300         //bottom_bar_up = (TextView)main.findViewById(R.id.bottom_bar_up);
301         //bottom_bar_down = (TextView)main.findViewById(R.id.bottom_bar_down);
302 
303         int[] power = {0, 1, 2, 3, 4, 5, 6, 7};
304         for(int i = 0; i < power.length; i++){
305             switch (power[i]){
306                 case 7:
307                     tvs[i].setText(getText(R.string.folder));
308                     break;
309                 case 6:
310                     tvs[i].setText(getText(R.string.person_info));
311                     break;
312                 case 5:
313                     tvs[i].setText(getText(R.string.system_info));
314                     break;
315                 case 4:
316                     tvs[i].setText(getText(R.string.hidden_danger_report));
317                     break;
318                 case 3:
319                     tvs[i].setText(getText(R.string.open));
320                     break;
321                 case 2:
322                     tvs[i].setText(getText(R.string.qr_code));
323                     break;
324                 case 1:
325                     tvs[i].setText(getText(R.string.work_order));
326                     break;
327                 case 0:
328                     tvs[i].setText(getText(R.string.routing_inspection));
329                     break;
330             }
331 
332 
333         }
334     }
335     /**
336      * 生成被拖动控件的preView
337      */
338     private void startDrag(Bitmap bm, int x, int y)
339     {
340         Log.v("startDrag>>>>>>", "startDrag");
341         stopDrag();
342         windowParams = new WindowManager.LayoutParams();
343         windowParams.gravity = Gravity.TOP | Gravity.LEFT;
344 
345         //左上角相对于屏幕的坐标
346         windowParams.x = x - dragPointX + dragOffsetX;
347         windowParams.y = y - dragPointY + dragOffsetY - 40;
348 
349         windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
350         windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
351         windowParams.alpha = 0.5f;
352 
353         ImageView iv = new ImageView(myActivity);
354         iv.setImageBitmap(bm);
355         windowManager = (WindowManager) myActivity.getSystemService(Context.WINDOW_SERVICE);
356         windowManager.addView(iv, windowParams);
357 
358         dragImageView = iv;
359     }
360 
361     /**
362      * 停止绘制,清空preView
363      */
364     private void stopDrag()
365     {
366         if (dragImageView != null)
367         {
368             windowManager.removeView(dragImageView);
369             dragImageView = null;
370             Log.v("StopDrag>>>>>>>", "disappear");
371         }
372     }
373 
374     /**
375      * 拖动(Move)过程中不断调整preView的位置,以呈现拖动的效果
376      */
377     private void onDrag(int x, int y) {
378         Log.v("onDrag>>>>>>", "onDrag");
379         if (dragImageView != null) {
380             windowParams.alpha = 0.5f;
381 
382             windowParams.x = x - dragPointX + dragOffsetX;
383             windowParams.y = y - dragPointY + dragOffsetY - 40;
384 
385             Log.v("x", String.valueOf(x));
386             Log.v("y", String.valueOf(y));
387             Log.v("windowParams.x", String.valueOf(windowParams.x));
388             Log.v("windowParams.y", String.valueOf(windowParams.y));
389             windowManager.updateViewLayout(dragImageView, windowParams);
390         }
391     }
392 
393     /**
394      * 返回参数View的相对屏幕的绝对坐标值
395      * point[0]用于记录左上角的X
396      * point[1]用于记录左上角的Y
397      * point[2]用于记录右下角的X
398      * point[3]用于记录右下角的Y
399      */
400     private int[] getPoint(View v){
401         int point[] = new int[4];
402         v.getLocationOnScreen(point);
403         point[2] = point[0] + v.getWidth();
404         point[3] = point[1] + v.getHeight();
405         for(int i = 0; i < point.length; i++){
406             System.out.println("point[" + i + "]::::::" + point[i]);
407         }
408 
409         return point;
410     }
411     /**
412      * 返回被拖动View的中心的坐标
413      */
414     private int[] getCentroPoint(View v){
415         int point[] = new int[2];
416         if(v != null){
417             point = new int[2];
418             v.getLocationOnScreen(point);
419             point[0] = point[0] + v.getWidth()/2;
420             point[1] = point[1] + v.getHeight()/2;
421             for(int i = 0; i < point.length; i++){
422                 System.out.println("point[" + i + "]::::::" + point[i]);
423             }
424         }
425         return point;
426     }
427 
428     /**
429      * 判断被拖动的View的中心点在哪个View内部,就把哪个View隐藏
430      */
431     private void hide(){
432         int point[] = getCentroPoint(dragImageView);
433         for(int i = 0; i < views.length; i++){
434             if(point[0] > points[i][0] && point[1] > points[i][1] && point[0] < points[i][2] && point[1] < points[i][3]){
435                 if(views[i].isShown()){
436                     toPoint = i;
437                     //temp_view_img_topoint = views[i].getBackground();
438 
439                     onExchange();//将被拖拽的View的原始位置的数据设置为被覆盖的View的数据
440 
441                     views[i].setVisibility(View.INVISIBLE);
442                 }
443 //                if(views[i].getAnimation() == null){
444 //                    views[i].startAnimation(blink);
445 //                    toPoint = i;
446 //                }
447             }else{
448 //                if(views[i].getAnimation() != null && !views[i].getAnimation().equals(original)){
449 //                    views[i].startAnimation(original);
450 //                }
451 //                views[i].clearAnimation();
452 //                views[i].invalidate();
453 //                toPoint = -1;
454                 if(toPoint == i){
455                     toPoint = -1;
456                     onExchange();//将被拖拽的View的原始位置的数据恢复初始数据
457                 }
458                 if(!views[i].isShown()){
459                     //Toast.makeText(this,i+"--",Toast.LENGTH_LONG).show();
460                     views[i].setVisibility(View.VISIBLE);
461                     //views[i].setBackground(temp_view_img_topoint);
462                 }
463             }
464         }
465         //temp.requestDisallowInterceptTouchEvent(false); //恢复 viewPager 的可侧滑
466     }
467     /**
468      * 拖动结束,将所有的View都显示出来
469      */
470     private void show(){
471         for(int i = 0; i < views.length; i++){
472             if(!views[i].isShown()){
473 //                toPoint = i;
474                 views[i].setVisibility(View.VISIBLE);
475                 views[i].startAnimation(flash);
476             }
477             views[i].setVisibility(View.VISIBLE);
478 //            if(views[i].getAnimation() != null && !views[i].getAnimation().equals(flash)){
479 //                views[i].startAnimation(flash);
480 //            }
481         }
482     }
483     /**
484      * 初始化所有View的坐标并存放到8行4列的二维数组point[8][4]
485      */
486     private void initPoints(){
487         for(int i = 0; i < points.length; i++){
488             points[i] = getPoint(views[i]);
489         }
490     }
491     /**
492      * 拖拽结束,将fromView和toView的内容进行交换
493      * @return 交换返回true,不交换返回false
494      */
495     private boolean exchange(){
496         if(fromPoint != -1 && toPoint != -1 && fromPoint != toPoint ){
497             tvs[fromPoint].setText(tvs[toPoint].getText());
498             //ivs[fromPoint].setImageDrawable(ivs[toPoint].getDrawable());
499             views[fromPoint].setBackground(views[toPoint].getBackground());
500 
501             tvs[toPoint].setText(temp_str);
502             //ivs[toPoint].setImageDrawable(temp_img);
503             views[toPoint].setBackground(temp_view_img);
504 
505             views[fromPoint].startAnimation(flash);
506 //            temp = toPoint;
507             fromPoint = -1;
508             toPoint = -1;
509             return true;
510         }else{
511             fromPoint = -1;
512             toPoint = -1;
513             return false;
514         }
515 
516     }
517     /**
518      * 用于正在被拖动View的原始位置的内容的实时交换
519      */
520     private void onExchange(){
521         if(fromPoint != -1 && toPoint != -1 && fromPoint != toPoint ){
522 
523             //将被拖拽的View的原始位置的数据, 设置为, 被覆盖的View的数据
524             //Toast.makeText(this,fromPoint+"--"+toPoint,Toast.LENGTH_LONG).show();
525             tvs[fromPoint].setText(tvs[toPoint].getText());
526             //ivs[fromPoint].setImageDrawable(ivs[toPoint].getDrawable());
527             //views[fromPoint].setBackgroundResource(views[fromPoint].getDrawable(R.drawable.two));
528 
529             // 不适用 getBackground() 传入,会造成大图失真
530             views[fromPoint].setBackground(getResources().getDrawable(relativeLayout_bgs[toPoint]));//实现拖曳过程中的实时互换
531             //views[toPoint].setBackground(views[fromPoint].getBackground());
532 
533             views[fromPoint].startAnimation(blink);
534 
535         }else{
536             //Toast.makeText(this,fromPoint+"--"+toPoint,Toast.LENGTH_LONG).show();
537             //将被拖拽的View的原始位置的数据恢复初始数据
538             tvs[fromPoint].setText(temp_str);
539             //ivs[fromPoint].setImageDrawable(temp_img);
540             views[fromPoint].setBackground(temp_view_img);
541         }
542     }
543     /**
544      * 用来显示更新bottom_bar中的数据
545      */
546     private void updateBottomBar(int sendPackageNo, int rate, double longitude, double dimension){
547         //在这里可以设置 footer 文本
548     }
549 
550 
551 
552     @Override
553     public boolean onOptionsItemSelected(MenuItem item) {
554         SharedPreferences preferences = myActivity.getSharedPreferences("system_config", myActivity.MODE_PRIVATE);
555         boolean isChanged = preferences.getBoolean("theme_value", true);
556         SharedPreferences.Editor editor = preferences.edit();
557         switch (item.getItemId()) {
558             case R.id.menu_settings: {
559 
560                 if (isChanged) {
561                     isChanged = false;
562                 } else {
563                     isChanged = true;
564                 }
565                 editor.putBoolean("theme_value", isChanged);
566                 editor.commit();
567                 break;
568             }
569         }
570         return super.onOptionsItemSelected(item);
571     }
572 
573 
574 }

 

打完收工,有问题请留言。

如果您认为这篇文章还不错或者有所收获,您可以通过扫描一下下面的支付宝二维码 打赏我一杯咖啡【物质支持】,也可以点击右下角的【推荐】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力


img_12e3f54d4d0f70f0eb14f20548e3d781.png
目录
相关文章
|
17天前
|
消息中间件 安全 数据处理
Android为什么不能在子线程更新UI
Android为什么不能在子线程更新UI
23 0
|
3月前
|
Android开发 开发者
Android UI设计: 请解释Activity的Theme是什么,如何更改应用程序的主题?
Android UI设计: 请解释Activity的Theme是什么,如何更改应用程序的主题?
41 1
|
3月前
|
开发工具 Android开发 开发者
Android UI设计: 解释Android的Nine-Patch图像是什么,它用于什么目的?
Android UI设计: 解释Android的Nine-Patch图像是什么,它用于什么目的?
31 4
|
3月前
|
API Android开发 开发者
Android UI设计: 什么是RecyclerView?为什么它比ListView更好?
Android UI设计: 什么是RecyclerView?为什么它比ListView更好?
31 2
|
3月前
|
Android开发 容器
Android UI设计: 什么是View和ViewGroup?
Android UI设计: 什么是View和ViewGroup?
36 0
|
3月前
|
数据可视化 Android开发 容器
Android UI设计: 请解释LinearLayout、RelativeLayout和ConstraintLayout的区别。
Android UI设计: 请解释LinearLayout、RelativeLayout和ConstraintLayout的区别。
93 5
|
3月前
|
API Android开发
Google I/O :Android Jetpack 最新变化(三)UI
Google I/O :Android Jetpack 最新变化(三)UI
49 0
|
6天前
|
编解码 Android开发 UED
安卓UI/UX设计原则:打造引人入胜的用户体验
【4月更文挑战第13天】本文探讨了安卓UI/UX设计的关键原则,包括一致性、简洁性、反馈、清晰性、效率和适应性。一致性要求视觉和行为保持一致,利用系统UI;简洁性减少用户行动,简化导航;反馈需即时且明确;清晰性强调表达清晰,布局有序;效率关注性能优化和任务简化;适应性涉及多设备适配和用户多样性。遵循这些原则,可创建出色应用,提供无缝用户体验。设计应持续迭代,适应技术发展和用户需求。
|
11天前
|
XML Java Android开发
Android之UI基础控件
Android之UI基础控件
|
12天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。

热门文章

最新文章