精华内容
下载资源
问答
  • 最近做了Android 设置的列表菜单风格改为Iphone的tab菜单风格的尝试!我知道,有许多朋友有自己的方式已经实现了这个界面风格的开发,今天大家来看看我的做法吧! 做这个开发前,首先要看看Android默认的设置列表...

            好久没有写博客了!最近做了Android 设置的列表菜单风格改为Iphone的tab菜单风格的尝试!我知道,有许多朋友有自己的方式已经实现了这个界面风格的开发,今天大家来看看我的做法吧!先看看如下图的效果:


             做这个开发前,首先要看看Android默认的设置列表菜单风格的实现!由 AndroidManifest.xml可以知道Settings这个Activity是我们关注的焦点!所以我们来到Settings.java来一探究竟,从中我们可以清除的知道他其实是一个PreferenceActivity,而PreferenceActivity又继承了ListActivity,我们知道ListActivity其实就是专门用于显示ListView的activity.这样一来,我们就清楚了,为什么显示的是列表菜单。实际上在Settings这个Activity里面利用这个函数loadHeadersFromResource来加载不同的xml配置文件,就可以加载对应的菜单了!在这个xml文件里面每一项菜单项几乎都定义了自己的fragment,这样一来,只要你点击对应的菜单就能进入对应的fragment了!

           如果,你多关注一下Settings这个activity,你就会发现这个activity比你想象的要复杂的多!比如,在手机里面很多需要对手机设置的地方都可能调用Settings这个activity,想要通过改动这个activity来实现Iphone的tab菜单风格,我觉得要冒一定的风险!所以,在做Iphone的tab菜单风格的时候我提出了两个规则:

          (1)尽量不影响Settings这个activity,包括这个activity的定义、已经被何时、何地被调用。

          (2)尽量要求效率!

          一般来说,做tab菜单风格无非有三种方式:(1)TabHost + ViewPager ;(2)ActionBar + ViewPager;(3)TabWidget + ViewPager;从中可以知道,都要用到ViewPager . 而ViewPager 是通过Adapter加载不同的view来实现不同的tab的菜单显示!这样的话就需要你写一个activity,通过加载包含ViewPager 的layout来实现!这样一来的话,要实现这个效果,你就需要从写一个另外一直方式的Settings的activity,这显然是有风险的!然后来看看ActionBar能否实现Iphone的tab折中底部tab按钮的效果!答案是否定的!(网上有各种办法,我实验的结果是无法实现这种效果的)。

          ok,来说说我的实现办法把!

           首先,我选择TabActivity来取代原来Settings的Activity地位!定义自己的TabActivity:TabSetting,在AndroidManifest.xml里面改为:

            <activity android:name="TabSetting"
                    android:label="@string/settings_label_launcher"
                    android:taskAffinity="com.android.settings"
                    android:theme="@style/Theme.Settings.Light"
    		        android:configChanges="keyboardHidden|screenSize|mcc|mnc"
                    android:launchMode="singleTask">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <action android:name="android.settings.SETTINGS" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.LAUNCHER" />
                    <category android:name="android.intent.category.APP_SETTINGS" />
                </intent-filter>
            </activity>

         原来的settings配置如下:

            <activity android:name="Settings"
                          android:label="@string/settings_label_launcher"
                          android:taskAffinity="com.android.settings"
                          android:theme="@style/Theme.Settings.Light" 
                          android:configChanges="keyboardHidden|screenSize|mcc|mnc"
                          android:launchMode="singleTask">
            </activity>


        然后来看看TabSetting这个Activity的布局文件的定义:

    <?xml version="1.0" encoding="utf-8"?>
    <TabHost 
    	android:id="@+android:id/tabhost" 
    	android:layout_width="fill_parent" 
    	android:layout_height="fill_parent"
    	xmlns:android="http://schemas.android.com/apk/res/android">
        <LinearLayout 
    		android:orientation="vertical" 
    		android:layout_width="fill_parent" 
    		android:layout_height="fill_parent">
            <FrameLayout 
    	        android:id="@+android:id/tabcontent" 
    	        android:layout_width="fill_parent" 
    	        android:layout_height="fill_parent" 
    	        android:layout_weight="1.0" />
            <TabWidget 
    	        android:orientation="horizontal" 
    	        android:id="@+android:id/tabs" 
    	        android:layout_width="fill_parent" 
    	        android:layout_height="57.0dip" 
    	        android:divider="@null" 
    	        style="?android:attr/tabWidgetStyle" />
        </Linear

        从上面的布局,我们就这里采用的是TabWidget.

       接下来的重点就是TabHost的配置了!我们直接看代码:

        private void createTabs(int selectedIndex) {
            mTabHost = getTabHost();
            LinearLayout tab_view;
            final LayoutInflater inflater = LayoutInflater.from(this);
    
            if (mTabHost != null) {
                Intent start_activity_intent = TabSettings_content.getIntent_for_tab(this);
                start_activity_intent.putExtra(INIT_SELECTED_TAB, selectedIndex);
    
                
                tab_view =(LinearLayout) inflater.inflate(tab_view_resource_id, mTabHost.getTabWidget(), false);
                
                ((TextView)tab_view.findViewById(R.id.tab_hint)).setText(R.string.meng_tab_network);
                ((ImageView)tab_view.findViewById(R.id.tab_icon)).setImageResource(R.drawable.xunhu_tab_network);
                 start_activity_intent.putExtra(SELECT_TAB_INTENT_EXTRA, NETWORK_TAB_INDEX);
                 mTabHost.addTab(mTabHost.newTabSpec("network")
                                             .setIndicator(tab_view)
                                             .set_SameContent(start_activity_intent));
                 
                tab_view =(LinearLayout) inflater.inflate(tab_view_resource_id, mTabHost.getTabWidget(), false);
                ((TextView)tab_view.findViewById(R.id.tab_hint)).setText(R.string.meng_tab_device);
                ((ImageView)tab_view.findViewById(R.id.tab_icon)).setImageResource(R.drawable.xunhu_tab_device);
                 start_activity_intent =(Intent) start_activity_intent.clone();
                 start_activity_intent.putExtra(SELECT_TAB_INTENT_EXTRA, DEVICE_TAB_INDEX);
                 mTabHost.addTab(mTabHost.newTabSpec("device")
                                             .setIndicator(tab_view)
                                             .set_SameContent(start_activity_intent));
    
                 tab_view =(LinearLayout) inflater.inflate(tab_view_resource_id, mTabHost.getTabWidget(), false);
                ((TextView)tab_view.findViewById(R.id.tab_hint)).setText(R.string.meng_tab_personal);
                ((ImageView)tab_view.findViewById(R.id.tab_icon)).setImageResource(R.drawable.xunhu_tab_personal);
                 start_activity_intent =(Intent) start_activity_intent.clone();
                 start_activity_intent.putExtra(SELECT_TAB_INTENT_EXTRA, PERSONAL_TAB_INDEX);
                 mTabHost.addTab(mTabHost.newTabSpec("personal")
                                             .setIndicator(tab_view)
                                             .set_SameContent(start_activity_intent));
    
    
                 tab_view =(LinearLayout) inflater.inflate(tab_view_resource_id, mTabHost.getTabWidget(), false);
                ((TextView)tab_view.findViewById(R.id.tab_hint)).setText(R.string.meng_tab_system);
                ((ImageView)tab_view.findViewById(R.id.tab_icon)).setImageResource(R.drawable.xunhu_tab_system);//
                 start_activity_intent =(Intent) start_activity_intent.clone();
                 start_activity_intent.putExtra(SELECT_TAB_INTENT_EXTRA, SYSTEM_TAB_INDEX);
                 mTabHost.addTab(mTabHost.newTabSpec("system")
                                             .setIndicator(tab_view)
                                             .set_SameContent(start_activity_intent));
    
    
                 mTabHost.setOnTabChangedListener(new OnTabChangeListener() {
                     public void onTabChanged(String tabId) {
                         if (tabId.equals("network")) 
                             {
                             mSelectedTab = NETWORK_TAB_INDEX;
                             }
                        else if(tabId.equals("device"))
                            {
                            mSelectedTab = DEVICE_TAB_INDEX;
                            }
                        else if(tabId.equals("personal"))
                            {
                            mSelectedTab = PERSONAL_TAB_INDEX;
                            }
                        else if(tabId.equals("system"))
                            {
                            mSelectedTab = SYSTEM_TAB_INDEX;
                            }
    
                        //mTabHost.setCurrentTab(mSelectedTab);
                        TabSetting.this.updateTabStyle(TabSetting.this.mTabHost);
                     }
                 });
            }
    
            
        }

        这里请关注一下红色的代码!你会发现不同tab都配置了相同的intent。这是为什么呢!实际上这个start_activity_intent就是用于启动我们shettings的avtivity的!所以,我的目的其实就是不同tab菜单的切换其实都是用一个activity,而且这个activity就是系统原本有的shettings的activity。只是在不同的tab,loadHeadersFromResource加载不同的xml来实现显示不同的菜单!这里我们来看看这个我们启动的activity(TabSettings_content)的定义:

    public class TabSettings_content extends Settings{
    	private static final boolean DEBUG = true;
        private static int mCurr_SelectedTab = TabSetting.NETWORK_TAB_INDEX;   
    	private static int mNext_SelectedTab = TabSetting.NETWORK_TAB_INDEX;  
    
    	private int SettingMenuStyle_index = -1;
    	....
    ....
    ....
    }

         从上面的代码可以知道 TabSettings_content其实就是一个Settings的封装。

    那在TabSettings_content里面是怎么知道在不同的tab界面加载不同的xlm文件呢!这个时候activity的onNewIntent这个方法就有用处了!如下:

        @Override
        public void onNewIntent(Intent newIntent) {
            super.onNewIntent(newIntent);
    
            // update our intent so that we can consult it to determine whether or
            // not the most recent launch was via the event
            setIntent(newIntent);
    
            //Get the saved selected tap_index, 
            int tab = newIntent.getIntExtra(TabSetting.SELECT_TAB_INTENT_EXTRA, mCurr_SelectedTab);
    		if (!getResources().getBoolean(R.bool.TabSettingPage_Change_Animal)){
    			if(tab != mCurr_SelectedTab){
    				mCurr_SelectedTab = tab;
    				mNext_SelectedTab = mCurr_SelectedTab;
    				invalidateHeaders();
    			}
            }else if (tab != -1 && tab != mCurr_SelectedTab) {
    			<span style="BACKGROUND-COLOR: #ff0000">Switch_tab_anima(tab);
    </span>        }
        }

    从上面的代码,你可能有点晕,因为你不太知道Switch_tab_anima(tab);这个语句在做什么。通过字面的意思,可以知道这应该就是tab切换并且还播放动画了! 其实这里播放的动画其实就是左右两个tab往左边移出、右边tab从右边移入的这样的一个动画效果!下面代码来看看这个方法Switch_tab_anima的实现吧:

     private void Switch_tab_anima(int the_tap_index){
     	if(false == Init_Animation){
     		Init_Animation_Play();
     	}
    	
    	if (the_tap_index != mCurr_SelectedTab && the_tap_index != -1) {
    
    		if((the_tap_index > mCurr_SelectedTab && !(the_tap_index == 3 && mCurr_SelectedTab == 0)) || (the_tap_index == 0 && mCurr_SelectedTab == 3)){
    			TabSettings_ListView.startAnimation(slide_left_out);
    	}
    		else{
    			TabSettings_ListView.startAnimation(slide_right_out);
    		}
    		mNext_SelectedTab = the_tap_index;
    	}
    
      }

        一样的,上面有两行我标记红色的代码,这个地方MainHandler就是一个我定义的Handler,主要目的就是延时,其目的是:原来的tab移除以后,新的tab才开始移入。这里的延时就是等原来的tab移除。

        最后,你会发现,我实现的这个tab菜单风格,当用手指左右滑动菜单时候,并不会切换到下一个tab(或者上一个tab),这怎么办呢!下面通过2步来实现:

       (1):首先要能获取手指触摸屏的事件:这里你不得不选择dispatchTouchEvent:

    	@Override
    	public boolean dispatchTouchEvent(MotionEvent m) {
    		// Elog.d(TAG, "dispatchTouchEvent()");
    		Log.d("TabSetting", "TabSetting dispatchTouchEvent()");
    		if (this.detector != null) {
    		this.detector.onTouchEvent(m);
    		}
    		boolean flag = super.dispatchTouchEvent(m);
    		Log.d("TabSetting", "TabSetting dispatchTouchEvent()  flag="+flag);
    		return flag;
    	}

       (2):我们刚刚定义的TabActivity:TabSetting 需要实现OnGestureListener这个手势接口!该接口的onFling和onScroll来实现识别手指滑动的操作,操作成功则切换不同tab:下面代码是方法onFling的实现(和方法onScroll实现一样的):

    	 @Override
    	 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    		 int tab_index;
    		 
             if(TouchedDown_Done == true){
    			 return false;
    		 }
    
    		 if (e1.getX() - e2.getX() > <span style="BACKGROUND-COLOR: #ff0000">move_switch_len</span>) { 
    		   tab_index = mSelectedTab == 3 ? 0:mSelectedTab+1;
    		   mTabHost.setCurrentTab(tab_index);
    		   mSelectedTab = tab_index;
    		   TouchedDown_Done = true;
    		   return true;
    		 }
    		 else if(e2.getX() - e1.getX() > move_switch_len){
    			 tab_index = mSelectedTab == 0 ? 3:mSelectedTab-1;
    			 mTabHost.setCurrentTab(tab_index);
    			 mSelectedTab = tab_index;
    			 TouchedDown_Done = true;
    		     return true;
    		 }
    		 else{
    			 return false;
    		 }
    	
    	   }

       关注一下move_switch_len这个量吧。这个值不能太大也不能太小!你知道原因吗?

        我想该说的已经说完了!我这里实现tab风格其实还是调用原来的Settings这个activity,只是外面用一个TabActivity包装了一下!这就是所有的!你应该了解了吧。




       

            

    展开全文
  •  修改桌面图标为魅族风格  重新ps电池及信号图标  重新ps拨号contact界面  状态栏仿魅族风格及布局  设置界面白底黑字  拨号及联系人界面白底黑字  设置加入自启动管理(灰常强大)  锁屏里面加入不...

      

      

      

      ROM介绍

      相对上个版本修改的地方如下:

      再度精简系统不常用的apk

      修改桌面图标为魅族风格

      重新ps电池及信号图标

      重新ps拨号contact界面

      状态栏仿魅族风格及布局

      设置界面白底黑字

      拨号及联系人界面白底黑字

      设置加入自启动管理(灰常强大)

      锁屏里面加入不锁屏选项

      应大家要求去除状态栏运营商标识

      省电测试为开数据一晚上掉电2%~3%

      ___________________________________________________________________________

      Rom下载地址:http://www.shuajizhijia.com/nubia/z5s/5334/ 

      更多努比亚 Z5S刷机包下载:http://www.shuajizhijia.com/nubia/z5s/

      ___________________________________________________________________________

    展开全文
  • 好,我们今天要讲的就是设置手机归属地的样式以及显示位置,先上图,让大家看一下我们今天要做的效果     大家可以看到,我们今天要做的就是显示风格和位置,那个显示风格就是上面的第二张图片,其实这个...



    最新实战教程,让你了解Android自动化刷量、作弊与防作弊的那些事,案例:刷友盟统计、批量注册苹果帐号




     

    首先,先把我之前写的那个更新操作的一个bug修复先,这个bug就是在Android4以上,我们已经不能在主线程里面进行网络操作的啦,如果进行网络操作,就会报错

    所以我们就要做一下改动,我们在onCreate方法里面开启一个线程,用来检测更新信息的

    		new Thread()
    		{
    			public void run() 
    			{
    				try
    				{
    					UpdateInfoService updateInfoService = new UpdateInfoService(SplashActivity.this);
    					info = updateInfoService.getUpdateInfo(R.string.serverUrl);
    				}
    				catch (Exception e)
    				{
    					e.printStackTrace();
    				}
    			};
    		}.start();


     

    然后呢,就在原来的isNeedUpdate方法里面进行一些修改啦

    	private boolean isNeedUpdate(String version)
    	{
    		if(info == null)
    		{
    			Toast.makeText(this, "获取更新信息异常,请稍后再试", Toast.LENGTH_SHORT).show();
    			loadMainUI();
    			return false;
    		}
    		String v = info.getVersion();
    		if(v.equals(version))
    		{
    			Log.i(TAG, "当前版本:" + version);
    			Log.i(TAG, "最新版本:" + v);
    			loadMainUI();
    			return false;
    		}
    		else
    		{
    			Log.i(TAG, "需要更新");
    			return true;
    		}
    	}


     

    好啦,到这里,我们的这个bug就修复的啦。在进入今天的内容之前,先谢谢一位网友啦,是他发现这个问题的,非常感谢!

    好,我们今天要讲的就是设置手机归属地的样式以及显示位置,先上图,让大家看一下我们今天要做的效果

        

    大家可以看到,我们今天要做的就是显示风格和位置,那个显示风格就是上面的第二张图片,其实这个功能很简单的,就是记录下来用户设置的风格,然后就进行一个背景的设置而已,而第二个要做的就是显示的位置啦,上面第三张图就是啦,我们把那个activity做成了透明的了,如果你觉得不好,那么也可以不做成透明的,我们可以手动那个紫色的方块,来确定要显示的位置!设置好这些之后,再把服务开启,我们就可以看到下面的效果的啦!

     

    好,废话不多说,我们现在就开始做,我们首先把风格那个对话框给做出来

    com.xiaobin.security.ui.AToolActivity

    package com.xiaobin.security.ui;
    
    import java.io.File;
    
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.content.SharedPreferences.Editor;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.os.Environment;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.CheckBox;
    import android.widget.CompoundButton;
    import android.widget.CompoundButton.OnCheckedChangeListener;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.xiaobin.security.R;
    import com.xiaobin.security.engine.DownloadTask;
    import com.xiaobin.security.service.AddressService;
    
    public class AToolActivity extends Activity implements OnClickListener
    {
    	private static final int ERROR = 0;
    	private static final int SUCCESS = 1;
    	
    	private TextView tv_atool_query;
    	private TextView tv_atool_number_service_state;
    	private CheckBox cb_atool_state;
    	private TextView tv_atool_select_bg;
    	private TextView tv_atool_change_location;
    	private Intent serviceIntent;
    	private ProgressDialog pd;
    	
    	private SharedPreferences sp;
    	
    	@SuppressLint("HandlerLeak")
    	private Handler handler = new Handler()
    	{
    		public void handleMessage(Message msg) 
    		{
    			switch(msg.what)
    			{
    				case ERROR : 
    					Toast.makeText(AToolActivity.this, "下载数据库失败,请检查网络!", Toast.LENGTH_SHORT).show();
    					break;
    					
    				case SUCCESS : 
    					Toast.makeText(AToolActivity.this, "数据库下载成功!", Toast.LENGTH_SHORT).show();
    					break;
    					
    				default : 
    					break;
    			}
    		}
    	};
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.atool);
    		
    		sp = getSharedPreferences("config", Context.MODE_PRIVATE);
    		
    		tv_atool_query = (TextView) findViewById(R.id.tv_atool_query);
    		tv_atool_query.setOnClickListener(this);
    		
    		tv_atool_select_bg = (TextView) findViewById(R.id.tv_atool_select_bg);
    		tv_atool_select_bg.setOnClickListener(this);
    		
    		tv_atool_change_location = (TextView) findViewById(R.id.tv_atool_change_location);
    		tv_atool_change_location.setOnClickListener(this);
    		
    		tv_atool_number_service_state = (TextView) findViewById(R.id.tv_atool_number_service_state);
    		cb_atool_state = (CheckBox) findViewById(R.id.cb_atool_state);
    		serviceIntent = new Intent(this, AddressService.class);
    		cb_atool_state.setOnCheckedChangeListener(new OnCheckedChangeListener()
    		{
    			@Override
    			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
    			{
    				if(isChecked)
    				{
    					startService(serviceIntent);
    					tv_atool_number_service_state.setTextColor(Color.BLACK);
    					tv_atool_number_service_state.setText("归属地服务已开启");
    				}
    				else
    				{
    					stopService(serviceIntent);
    					tv_atool_number_service_state.setTextColor(Color.RED);
    					tv_atool_number_service_state.setText(R.string.number_service_state);
    				}
    			}
    		});
    	}
    
    	@Override
    	public void onClick(View v)
    	{
    		switch(v.getId())
    		{
    			case R.id.tv_atool_query : 
    				query();
    				break;
    				
    			case R.id.tv_atool_select_bg : 
    				selectStyle();
    				break;
    				
    			case R.id.tv_atool_change_location : 
    				Intent intent = new Intent(this, DragViewActivity.class);
    				startActivity(intent);
    				break;
    				
    			default : 
    				break;
    		}
    	}
    	
    	private void query()
    	{
    		if(isDBExist())
    		{
    			Intent intent = new Intent(this, QueryNumberActivity.class);
    			startActivity(intent);
    		}
    		else
    		{
    			//提示用户下载数据库
    			pd = new ProgressDialog(this);
    			pd.setMessage("正在下载数据库...");
    			pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    			pd.setCancelable(false);
    			pd.show();
    			new Thread()
    			{
    				public void run() 
    				{
    					String path = getResources().getString(R.string.serverdb);
    					File dir = new File(Environment.getExternalStorageDirectory(), "/security/db");
    					if(!dir.exists())
    					{
    						dir.mkdirs();
    					}
    					String dbPath = Environment.getExternalStorageDirectory() + "/security/db/data.db";
    					try
    					{
    						//这个类,我们在做更新apk的时候已经写好的啦,现在直接拿过来用就可以啦
    						DownloadTask.getFile(path, dbPath, pd);
    						pd.dismiss();
    					}
    					catch (Exception e)
    					{
    						e.printStackTrace();
    						pd.dismiss();
    						Message message = new Message();
    						message.what = ERROR;
    						handler.sendMessage(message);
    					}
    				};
    			}.start();
    		}
    	}
    	
    	private boolean isDBExist()
    	{
    		if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
    		{
    			File file = new File(Environment.getExternalStorageDirectory() + "/security/db/data.db");
    			if(file.exists())
    			{
    				return true;
    			}
    		}
    		return false;
    	}
    	
    	//显示风格的对话框,我准备了5张不同风格的背景图片,根据用户选择的风格不一样,设置不同的背景
    	private void selectStyle()
    	{
    		AlertDialog.Builder builder = new AlertDialog.Builder(this);
    		builder.setTitle("归属地显示风格");
    		String[] items = new String[] {"半透明", "活力橙", "苹果绿", "孔雀蓝", "金属灰"};
    		builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener()
    		{
    			@Override
    			public void onClick(DialogInterface dialog, int which)
    			{
    				Editor editor = sp.edit();
    				editor.putInt("background", which);
    				editor.commit();
    			}
    		});
    		builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener()
    		{
    			@Override
    			public void onClick(DialogInterface dialog, int which)
    			{
    				
    			}
    		});
    		builder.create().show();
    	}
    
    }
    


     

    我们写了一个方法,selectStyle这个方法会把用户的设置记录下来,然后我们就在显示那个归属地那里读取出来,设置一下背景就可以啦,但我们现在先把那个显示位置的也做出来先

    其实这个也很简单的,我们就用一个onTouch事件,然后记录下最终的位置就可以的啦

    com.xiaobin.security.ui.DragViewActivity

    package com.xiaobin.security.ui;
    
    import android.app.Activity;
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.content.SharedPreferences.Editor;
    import android.os.Bundle;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;
    import android.view.Window;
    import android.widget.ImageView;
    import android.widget.RelativeLayout;
    import android.widget.RelativeLayout.LayoutParams;
    
    import com.xiaobin.security.R;
    
    public class DragViewActivity extends Activity implements OnTouchListener
    {
    	private ImageView iv_drag_location;
    	private SharedPreferences sp;
    	
    	//记录第一次触摸的坐标
    	private int startX;
    	private int startY;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		requestWindowFeature(Window.FEATURE_NO_TITLE);
    		setContentView(R.layout.drag_view);
    		
    		sp = getSharedPreferences("config", Context.MODE_PRIVATE);
    		
    		iv_drag_location = (ImageView) findViewById(R.id.iv_drag_location);
    		iv_drag_location.setOnTouchListener(this);
    	}
    	
    	@Override
    	protected void onResume()
    	{
    		super.onResume();
    		
    		//加载上次移动的效果
    		int x = sp.getInt("lastX", 0);
    		int y = sp.getInt("lastY", 0);
    		/*iv_drag_location.layout(iv_drag_location.getLeft() + x, iv_drag_location.getTop() + y, 
    				iv_drag_location.getRight() + x, iv_drag_location.getBottom() + y);
    		iv_drag_location.invalidate();*/
    		RelativeLayout.LayoutParams params = (LayoutParams) iv_drag_location.getLayoutParams();
    		params.leftMargin = x;
    		params.topMargin = y;
    		iv_drag_location.setLayoutParams(params);
    	}
    
    	@Override
    	public boolean onTouch(View v, MotionEvent event)
    	{
    		switch(v.getId())
    		{
    			case R.id.iv_drag_location : 
    				switch(event.getAction())
    				{
    					case MotionEvent.ACTION_DOWN : 
    						startX = (int) event.getRawX();
    						startY = (int) event.getRawY();
    						break;
    						
    					case MotionEvent.ACTION_MOVE : 
    						int x = (int) event.getRawX();
    						int y = (int) event.getRawY();
    						
    						//算出移动距离
    						int dx = x - startX;
    						int dy = y - startY;
    						int l = iv_drag_location.getLeft();
    						int r = iv_drag_location.getRight();
    						int t = iv_drag_location.getTop();
    						int b = iv_drag_location.getBottom();
    						
    						//设置新的布局位置
    						iv_drag_location.layout(l + dx, t + dy, r + dx, b + dy);
    						
    						//重新获取位置
    						startX = (int) event.getRawX();
    						startY = (int) event.getRawY();
    						break;
    						
    					case MotionEvent.ACTION_UP : 
    						int lastX = iv_drag_location.getLeft();
    						int lastY = iv_drag_location.getTop();
    						Editor editor = sp.edit();
    						editor.putInt("lastX", lastX);
    						editor.putInt("lastY", lastY);
    						editor.commit();
    						break;
    						
    					default : 
    						break;
    				}
    				break;
    				
    			default : 
    				break;
    		}
    		return true;
    	}
    
    }
    


     

    好啦,写完这两个,我们就可以回到我们之前显示归属地的那个Service里面写逻辑啦

    com.xiaobin.security.service.AddressService

    package com.xiaobin.security.service;
    
    import android.app.Service;
    import android.content.Context;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.graphics.PixelFormat;
    import android.os.IBinder;
    import android.telephony.PhoneStateListener;
    import android.telephony.TelephonyManager;
    import android.view.Gravity;
    import android.view.View;
    import android.view.WindowManager;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    import com.xiaobin.security.R;
    import com.xiaobin.security.engine.NumberAddressService;
    
    public class AddressService extends Service
    {
    	private TelephonyManager telephonyManager;
    	private MyPhoneListener listener;
    	private WindowManager windowManager;
    	private View view;
    	
    	private SharedPreferences sp;
    
    	@Override
    	public IBinder onBind(Intent intent)
    	{
    		return null;
    	}
    	
    	@Override
    	public void onCreate()
    	{
    		super.onCreate();
    		
    		sp = getSharedPreferences("config", Context.MODE_PRIVATE);
    		
    		windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
    		listener = new MyPhoneListener();
    		telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    		telephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
    	}
    	
    	@Override
    	public void onDestroy()
    	{
    		super.onDestroy();
    		//停止监听
    		telephonyManager.listen(listener, PhoneStateListener.LISTEN_NONE);
    	}
    	
    	//显示归属地的窗体
    	private void showLocation(String address)
    	{
    		WindowManager.LayoutParams params = new WindowManager.LayoutParams();
    		params.width = WindowManager.LayoutParams.WRAP_CONTENT;
    		params.height = WindowManager.LayoutParams.WRAP_CONTENT;
    		params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE //无法获取焦点
    				| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE //无法点击
    				| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;//保持屏幕亮
    		params.format = PixelFormat.TRANSLUCENT;//设置成半透明的
    		params.type = WindowManager.LayoutParams.TYPE_TOAST;
    		params.setTitle("Toast");
    		
    		//主要是确定坐标系是从左上角开始的,不然呆会设置位置的时候有些麻烦
    		params.gravity = Gravity.LEFT | Gravity.TOP;
    		params.x = sp.getInt("lastX", 0);
    		params.y = sp.getInt("lastY", 0);
    		
    		view = View.inflate(getApplicationContext(), R.layout.show_location, null);
    		LinearLayout ll = (LinearLayout) view.findViewById(R.id.ll_location);
    		int type = sp.getInt("background", 0);
    		switch(type)
    		{
    			case 0 : 
    				ll.setBackgroundResource(R.drawable.call_locate_white);
    				break;
    				
    			case 1 : 
    				ll.setBackgroundResource(R.drawable.call_locate_orange);
    				break;
    				
    			case 2 : 
    				ll.setBackgroundResource(R.drawable.call_locate_green);
    				break;
    				
    			case 3 : 
    				ll.setBackgroundResource(R.drawable.call_locate_blue);
    				break;
    				
    			case 4 : 
    				ll.setBackgroundResource(R.drawable.call_locate_gray);
    				break;
    				
    			default : 
    				break;
    		}
    		
    		TextView tv = (TextView) view.findViewById(R.id.tv_show_location);
    		tv.setText("归属地: " + address);
    		windowManager.addView(view, params);
    	}
    	
    	//========================================================================
    	
    	private class MyPhoneListener extends PhoneStateListener
    	{
    		@Override
    		public void onCallStateChanged(int state, String incomingNumber)
    		{
    			super.onCallStateChanged(state, incomingNumber);
    			
    			switch(state)
    			{
    				case TelephonyManager.CALL_STATE_IDLE : //空闲状态
    					if(view != null)
    					{
    						windowManager.removeView(view);//移除显示归属地的那个view
    						view = null;
    					}
    					break;
    					
    				case TelephonyManager.CALL_STATE_OFFHOOK : //接通电话
    					if(view != null)
    					{
    						windowManager.removeView(view);//移除显示归属地的那个view
    						view = null;
    					}
    					break;
    					
    				case TelephonyManager.CALL_STATE_RINGING : //铃响状态
    					String address = NumberAddressService.getAddress(incomingNumber);
    					showLocation(address);
    					break;
    					
    				default : 
    					break;
    			}
    		}
    	}
    
    }
    


     

    好啦,到现在为止,我们的显示风格还有显示位置就已经全部完成的啦!下次我们就会讲高级工具里面的黑名单功能的啦!

     

    今天源码下载

    展开全文
  • 通过简单的几步设置。很快搭建好了! 效果图: 第一步:要搭建的二级域名解析到空间。目录和主目录一致。 第二步:在PHPcmsV9管理后台添加手机门户 PHPCMS V9后台管理中心 》模块 》手机门户 》 添加手机
    用PHPCMS最新发布的V9搭建了ONOW中文网,WEB网站(www.onow.cn)完成后,有用户提供手机访问的问题,于是着手搭建ONOW手机WAP站(3g.onow.cn),官方没有详细的介绍,多亏得PHPCMS团队成员未知的帮助,才得以顺利完成,在此先表示感谢。
    

      先放张截图

      用PHPCMS V9完成wap搭建需要以下几步:

      第一步:域名解析并建站

      进入域名管理,建立A记录,解析至相应的IP地址,比如将3g.onow.cn 解析至202.165.183.12 ,在WEB服务设置中(IIS或apache)中建站,主目录与www.onow.cn的主目录一致,但默认首页要设成index.php,而www.onow.cn的默认首页是index.html

      第二步:在PHPcms V9管理后台添加手机门户

      PHPCMS V9后台管理中心 》模块 》手机门户 》 添加手机站点

      填写站点名称、LOGO、绑定域名,注意域名一定是http://开头的。

      第三步:分类管理

      在建好的手机门户列表管理操作中有一项“分类管理”,WAP的分类需要新建,然后绑定对应的栏目,这种耦合方式比较好,也比较灵活。

      第四步:更改route.php

      文件路径 /caches/configs/route.php

      在 return array 中增加

      ‘3g.onow.cn’=>array(‘m’=>’wap’, ‘c’=>’index’, ‘a’=>’init’,'data’=>array(‘GET’=>array(’siteid’=>1))),

      然后保存

      经过以上4步就完成了wap手机站的搭建,示例可看 3g.onow.cn

      WAP模板可以在 PHPCMS V9后台管理中心 》界面 》模板风格 中去找到修改!3g.onow.cn对模板做了一些修改,大家可以参考。



    转载出自 :http://www.sootoo.com/content/108738.shtml

    相关文章 :http://blog.csdn.net/yanhui_wei/article/details/8271985

    展开全文
  • Android手机移植TensorFlow,实现物体识别、行人检测、图像风格迁移 转载: http://mp.weixin.qq.com/s/ZUaxGPgqAGrN9itwRnSL2A 详解如何将TensorFlow训练的模型移植到安卓手机 ...最近上Gi
  • 苹果手机的meta设置

    千次阅读 2014-11-27 10:09:01
    ,这两个会让网页内容以应用程序风格显示,并使状态栏透明。  name="apple-mobile-web-app-capable" content="yes">  name="apple-mobile-web-app-status-bar-style" content="black-translucent"> ...
  • 本人亲测,以网上随便下的一个类似的主题为范本,花了... 导出的 setting.zip 配置 见百度网盘: 链接:https://pan.baidu.com/s/1i1KfkAX9yxQR1ct1C_0ebQ 提取码:7c31 如果链接失效,可私信,手机端CSDN app可收到。
  • 2017/02/13贴一个TensorFlow 2017开发者大会的Mobile专题演讲移动和嵌入式TensorFlow这里面有重点讲到本文介绍的...android demo又更新了,除了基本的修改以外,又增加了一个图像风格迁移的安卓demo,而且还增加了Andro
  • Keras实现风格迁移

    千次阅读 2018-09-02 17:21:15
    风格迁移算法经历多次定义和更新,现在应用在许多智能手机APP上。 风格迁移在保留目标图片内容的基础上,将图片风格引用在目标图片上。 风格本质上是指在各种空间尺度上图像中的纹理,颜色和视觉图案;内容是图像...
  • C2代码风格

    千次阅读 2018-06-21 13:36:11
    C2代码风格   1.C2体系结构风格的由来   软件体系结构设计的一个核心问题就是能否使用重复的体系结构模式,即能否达到体系结构级的软件重用。 C2 = EBI(基于事件的集成)+ LCS(分层客户端服务器)   2....
  • 打开项目的AndroidManifesat.xml文件,如下:  定位到style文件:   修改这个颜色和你想要实现的标题栏的颜色就行了~
  • 1. 应用程序 – 这个设置可以帮助你处理手机的应用程序管理. 允许移动应用程序 - 这是个复选框,如果你勾选的话,你将会得到一个移动应用程序到外置内存卡的选项。此设置跟下面的“安装位置”相关。安装位置 – 此...
  • CSS字体样式设置、CSS文本样式设置

    千次阅读 2019-10-22 18:23:54
    用于设置字体风格,可设置以下值: ① normal:普通字体 ② italic:斜体 ③ oblique:倾斜字体 (2)字体粗细 font-weight 用于设置字体粗细,可设置以下值: ① normal:正常粗细 ② bold:粗...
  • 2017/02/23 更新贴一个TensorFlow 2017开发者大会的Mobile专题演讲移动和嵌入式TensorFlow这里面...Tensorflow 的 Android demo又更新了,除了基本的修改以外,又增加了一个图像风格迁移的安卓demo,而且还增加了A...
  • Material Design ,中文名:材料设计语言,是由Google推出的全新的设计语言,谷歌表示,这种设计语言旨在为手机、平板电脑、台式机和“其他平台”提供更一致、更广泛的“外观和感觉”。 添加依赖 ...
  • Material风格的悬浮按钮

    千次阅读 2017-02-08 19:55:22
    Material风格的悬浮按钮 简介在material 风格的设计中,一个悬浮按钮代表了它的最初动作。 它们是悬浮在UI界面上的一个圆形按钮,并且有一些动作,包括变形,发射,位移等 在build.gradle file 文件的dependencies...
  • 移动端网页添加ios风格日历控件

    千次阅读 2016-03-07 16:04:09
    我们在进行手机端网页开发的时候,往往电脑上那些控件就不再适用了,不是很小看不清,就是风格不合适.  下面就推荐一个适合手机端网页开发适用的js插件 ,...设置ios风格的 日历控件 html 页面:      生 日  
  • 新小米手机--首次使用

    千次阅读 2019-05-15 13:26:36
    开始使用小米手机1、手机开机2、选择语言3、连接互联网4、使用条款5、登陆小米账号6、开启查找手机7、恢复数据8、其他设置9、个性化风格10、系统导航方式11、完成 本文转载自:...
  • 通话设置

    千次阅读 2017-03-13 14:24:13
    概述 Android的通话设置代码5.0之前...Telephony目录下代码主要可以分为通话设置(呼叫等待、呼叫转移等)和网络设置(开启数据网络、数据漫游,网络选择等)两个部分,通话设置原生的入口在拨号盘的菜单中,网络设置
  • hbuilderx设置状态栏

    千次阅读 2019-11-02 09:00:22
    通常APP都有属于自己的色调风格,为了达到整体视觉美观,通常会设置状态栏和标题栏的色调设置成一致。 图例: 二、状态栏状态类型 默认 变色(设置颜色) 透明(沉浸式) 消失(全屏) 三、状态栏变色 1.效果如图:...
  • Android 切换应用主题风格

    万次阅读 2014-10-01 22:15:03
    就是在设置里提供一个ToggleButton,打开或者关闭夜间模式。同时在新的API里提供接口,对所有支持夜间模式的应用进行统一调度。打开总开关,默认开启其他第三方应用的夜间模式。然后也设置一个规则,可忽略某个软件...
  • 用户点击对话框的确定按钮,跳转页面的时候判断用户此前是否设置手机防盗功能 如果设置过,直接跳转到防盗页面 如果没设置过,进入设置向导页面,进行相应的配置。 设置向导页面的效果图: 功能的技术点: ...
  • CSS风格导入

    千次阅读 2006-05-09 12:17:00
    (一) 风格导入相关 风格导入图解帖 http://bbs.dvbbs.net/dispbbs.asp?BoardID=102&ID=927456&replyID=&skin=1 风格导入录象 http://bbs
  • 基于STM32设计的遥控小车(手机APP+GPS+温湿度+ESP8266)

    万次阅读 多人点赞 2021-06-11 00:33:42
    手机APP: 采用QT设计,程序支持跨平台编译运行(Android、IOS、Windows、Linux都可以编译运行,对应平台上QT的环境搭建,之前博客已经发了文章讲解) 硬件包含: 淘宝购买的完整一套4轮遥控小车(采用STM32F103ZET6作为...
  • Android底部弹出iOS7风格对话选项框

    千次阅读 2015-04-08 14:22:46
    《Android底部弹出iOS7风格对话选项框》 效果图如下: 网上流传的Android底部弹出iOS7风格的对话选项框开源代码,原作者不详。我在网上流传的代码基础上改进了一些地方,把原来作为Application发布...
  • 我们在制作网站的时候,希望自己的网站是多风格的,用户可以根据自己的喜好选择不同的风格,这样的风格可以是布局上的变化,也可以是色彩上的差异,也可能是针对不同的用户群而非凡定制的样式。  我们该如何实现多...
  • 在Android中我们经常需要设置屏幕顶部状态栏的主题和应用页面保持同一风格,本文介绍几种常用的设置方案: 状态栏将显示为纯净的颜色,没有渐变效果 /** * 状态栏相关工具类 * */ public class ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 43,092
精华内容 17,236
关键字:

怎么设置手机风格