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
目录
相关文章
|
2月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
61 20
Android经典面试题之图片Bitmap怎么做优化
|
2月前
|
前端开发 图形学 开发者
【独家揭秘】那些让你的游戏瞬间鲜活起来的Unity UI动画技巧:从零开始打造动态按钮,提升玩家交互体验的绝招大公开!
【9月更文挑战第1天】在游戏开发领域,Unity 是最受欢迎的游戏引擎之一,其强大的跨平台发布能力和丰富的功能集让开发者能够迅速打造出高质量的游戏。优秀的 UI 设计对于游戏至关重要,尤其是在手游市场,出色的 UI 能给玩家留下深刻的第一印象。Unity 的 UGUI 系统提供了一整套解决方案,包括 Canvas、Image 和 Button 等组件,支持添加各种动画效果。
122 3
|
3月前
|
数据处理 开发工具 数据安全/隐私保护
Android平台RTMP推送|轻量级RTSP服务|GB28181接入之文字、png图片水印的精进之路
本文探讨了Android平台上推流模块中添加文字与PNG水印的技术演进。自2015年起,为了满足应急指挥及安防领域的需求,逐步发展出三代水印技术:第一代为静态文字与图像水印;第二代实现了动态更新水印内容的能力,例如实时位置与时间信息;至第三代,则优化了数据传输效率,直接使用Bitmap对象传递水印数据至JNI层,减少了内存拷贝次数。这些迭代不仅提升了用户体验和技术效率,也体现了开发者追求极致与不断创新的精神。
|
3月前
|
自然语言处理 定位技术 API
Android经典实战之如何获取图片的经纬度以及如何根据经纬度获取对应的地点名称
本文介绍如何在Android中从图片提取地理位置信息并转换为地址。首先利用`ExifInterface`获取图片内的经纬度,然后通过`Geocoder`将经纬度转为地址。注意操作需在子线程进行且考虑多语言支持。
218 4
|
3月前
|
开发者 图形学 前端开发
绝招放送:彻底解锁Unity UI系统奥秘,五大步骤教你如何缔造令人惊叹的沉浸式游戏体验,从Canvas到动画,一步一个脚印走向大师级UI设计
【8月更文挑战第31天】随着游戏开发技术的进步,UI成为提升游戏体验的关键。本文探讨如何利用Unity的UI系统创建美观且功能丰富的界面,包括Canvas、UI元素及Event System的使用,并通过具体示例代码展示按钮点击事件及淡入淡出动画的实现过程,助力开发者打造沉浸式的游戏体验。
87 0
|
3月前
|
Android开发
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
54 0
|
3月前
|
图形学
小功能⭐️Unity获取点击到的UI
小功能⭐️Unity获取点击到的UI
|
3月前
|
XML 前端开发 Android开发
Android经典实战之Kotlin中实现圆角图片和圆形图片
本文介绍两种实现圆角图像视图的方法。第一种是通过自定义Kotlin `AppCompatImageView`,重写`onDraw`方法使用`Canvas`和`Path`进行圆角剪裁。第二种利用Android Material库中的`ShapeableImageView`,简单配置即可实现圆角效果。两种方法均易于实现且提供动态调整圆角半径的功能。
64 0
|
4月前
|
异构计算 Python
30行代码实现一个带UI界面的图片背景移除工具:并附带web网页
人工智能技术正处于蓬勃发展中,移除图片背景的方法众多,涵盖了各式各样的实现途径和模型。然而,这些方法往往在安装和配置环境方面稍显复杂。今天,介绍一种极其简便的方法——大约30行代码,就能实现这一功能。虽然相比之下可能稍显简单,但对于不太苛刻的需求来说,这种方法颇为方便实用。
|
5月前
|
Android开发
Android中如何快速的实现RecycleView的拖动重排序功能
使用`ItemTouchHelper`和自定义`Callback`,在`RecyclerView`中实现拖动排序功能。定义`ItemTouchHelperAdapter`接口,`Adapter`实现它以处理`onItemMove`方法。`SimpleItemTouchHelperCallback`设置拖动标志,如`LEFT`或`RIGHT`(水平拖动),并绑定到`RecyclerView`以启用拖动。完成这些步骤后,即可实现拖放排序。关注公众号“AntDream”获取更多内容。
109 3