面试记录

中华新闻

  • 侧边栏
    setContentView(R.layout.activity_main);
    // 添加侧边栏
    setBehindContentView(R.layout.left_menu);
    SlidingMenu slidingMenu = getSlidingMenu();
    // 全屏触摸
    slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
    // 屏幕预留200像素
    // 代码适配
    Display display = getWindowManager().getDefaultDisplay();
    int width = display.getWidth();
    slidingMenu.setBehindOffset((int) (width * 0.625));
    initFragment();
  • 填充碎片
    private void initFragment() {
    // Fragment管理器
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction transaction = fm.beginTransaction();// 开始事务
    // 将帧布局替换为对应的Fragment
    transaction
    .replace(R.id.fl_content, new ContentFragment(), TAG_CONTENT);
    transaction.replace(R.id.fl_left_menu, new LeftMenuFragment(),
    TAG_LEFT_MENU);
    transaction.commit();// 提交事务
    // fm.findFragmentByTag(TAG_CONTENT);
    }
  • 事件的分发机制
    分发机制
  • 侧边栏有
    第三方登入:
    友盟+
    Mob Android Single Sign-On (SSO)
    跳转到登入界面:
    @Override
    public void next_activity() {
    // 跳转到第二个界面
    Intent intent = new Intent(this, SetUp2Activity.class);
    startActivity(intent);
    finish();
    //执行平移动画
    //执行界面切换动画的操作,是在startActivity或者finish之后执行
    //enterAnim : 新的界面进入的动画
    //exitAnim : 旧的界面退出的动画
    overridePendingTransition(R.anim.setup_enter_next, R.anim.setup_exit_next);
    }
    动画效果:
    setup_enter_next android:fromXDelta="100%" android:toXDelta="0"
    setup_exit_next android:fromXDelta="0%" android:toXDelta="-100"
  • 主页
    0. 整个是个viewPager
    1. topBar
    2. viewPagerIndicator(第三方工具)
    3.子嵌套的viewPager,可以修改viewPager的源码
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
    this.getParent().requestDisallowInterceptTouchEvent(true);
    return super.dispatchTouchEvent(ev);
    }
    3. listView
    TextView ImgerView组成(3小时前)
    有图片就VISIBIbY,没有图片就GONE
    4. PullToRefresh(没有用到)
    被Goggle官方出品的SwiperRefreshLayout(自动刷新)代替啦,
    好想是android5.0 出现的,知乎就是这的这个。
    5. 加载数据
    xutls中的htttpUtils
    还有android自带的HttpURLConnection(URLConnection的子类)
    conn = (HttpURLConnection) new URL(url).openConnection();
    conn.setConnectTimeout(5000);
    conn.setReadTimeout(5000);
    conn.setRequestMethod("GET");
    conn.connect();

          int code = conn.getResponseCode();
          if (code == 200) {
              InputStream is = conn.getInputStream();
              Bitmap bitmap = BitmapFactory.decodeStream(is);
              // 将图片存到本地
              localCacheUtils.setBitmapToLocal(bitmap, url);
              // 将图片存到内存
              memoryCacheUtils.setBitmapToMemory(url, bitmap);
              return bitmap;
          }
      6. 网络请求哪家强
               优先推荐Retrofit, 需要遵循RESTful的风格和能力掌握
               Volley, 毕竟Volley你不需要做过度的封装, 当然不适合传大数据(图片)。
               okHttp性能最高, 但是必须要做一些封装。
               ImagerLoader被Volley封装        
               高效:
                       OkHttp > Retrofit > Volley
               健壮性:
                       Retrofit > Volley > OkHttp
               易用性:
                       Volley > OkHttp > Retrofit 
     
     7. 图片三级缓存机制              
            网络缓存
        public void getBitMapFormNet(ImageView iv, String url) {
    
               BitmapTask bitmap = new BitmapTask();
               bitmap.execute(iv, url);
        }
    
      ** AsyncTask **
      class BitmapTask extends AsyncTask {
    
      private ImageView imageView;
    
      // 主线程, 预处理
      @Override
      protected void onPreExecute() {
          super.onPreExecute();
      }
    
      // 子线程运行
      @Override
      protected Bitmap doInBackground(Object... params) {
    
          imageView = (ImageView) params[0];
          mUrl = (String) params[1];
          // 设置标识
          imageView.setTag(mUrl);
          return download(imageView, mUrl);
      }
    
      // 主线程运行
      @Override
      protected void onPostExecute(Bitmap result) {
          super.onPostExecute(result);
    
          if (result != null) {
    
              String url = (String) imageView.getTag();
              if (mUrl.equals(url)) {
                  imageView.setImageBitmap(result);
                  System.out.println("从网络中下载图片成功!");
              }
          }
      }
    
      // 主线程运行, 进度不断更新方法
      @Override
      protected void onProgressUpdate(Integer... values) {
      }
    }
    8. 通过BitmapFactory解码(获取)Bitmap的几种方式
          **decodeFile()**    //从SD卡文件读取
          **decodeResource()**//从资源文件res读取
          **decodeStream()**  //从输入流读取
          **decodeByteArray()** //从字节数组读取
    
  • 资讯
    list_item下的 一个图片 下面4个小图片

  • ListView包含不同Item的布局
    1. 重写 getViewTypeCount() – 该方法返回多少个不同的布局
    2. 重写 getItemViewType(int) – 根据position返回相应的Item
    3. 根据view item的类型,在getView中创建正确的convertView

  • 城市
    和资讯的布局一模一样

  • 设置(了解)
    builder.setTitle("字体设置");
    String[] items = new String[] { "超大号字体", "大号字体", "正常字体", "小号字体",
    "超小号字体" };
    builder.setSingleChoiceItems(items, mSelectItem,
    new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    mCurrentItem = which;
    }
    });
    builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {

          @Override
          public void onClick(DialogInterface dialog, int which) {
    
              WebSettings settings = mWebView.getSettings();
              switch (mCurrentItem) {
              case 0:
    
                  settings.setTextSize(TextSize.LARGEST);
                  break;
              case 1:
    
                  settings.setTextSize(TextSize.LARGER);
                  break;
              case 2:
    
                  settings.setTextSize(TextSize.NORMAL);
                  break;
              case 3:
    
                  settings.setTextSize(TextSize.SMALLER);
                  break;
              case 4:
    
                  settings.setTextSize(TextSize.SMALLEST);
                  break;
    
              default:
                  break;
              }
    
              // 将最终选择的状态赋值给初始化状态
              mSelectItem = mCurrentItem;
          }
      });
    
  • 获取缓存,清理缓存
    PackageManager pm = getPackageManager();
    //pm.getPackageSizeInfo("com.example.writecache", mStatsObserver);
    /**
    * 10-22 05:24:52.906: I/System.out(15794): cachesize:4.00KB codesize:0.96MB datasize:0.00B
    */
    //反射获取缓存
    try {
    Class loadClass = MainActivity.class.getClassLoader().loadClass("android.content.pm.PackageManager");
    Method method = loadClass.getDeclaredMethod("getPackageSizeInfo", String.class,IPackageStatsObserver.class);
    //receiver : 类的实例,隐藏参数,方法不是静态的必须指定
    method.invoke(pm, "com.example.writecache",mStatsObserver);
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

       IPackageStatsObserver.Stub mStatsObserver = new IPackageStatsObserver.Stub() {
      public void onGetStatsCompleted(PackageStats stats, boolean succeeded) {
          long cachesize = stats.cacheSize;//缓存大小
          long codesize = stats.codeSize;//应用程序的大小
          long datasize = stats.dataSize;//数据大小
          
          String cache = Formatter.formatFileSize(getApplicationContext(), cachesize);
          String code = Formatter.formatFileSize(getApplicationContext(), codesize);
          String data = Formatter.formatFileSize(getApplicationContext(), datasize);
          
          System.out.println("cachesize:"+cache +" codesize:"+code+" datasize:"+data);
       }
     };
        **权限 Android_UserPerssion_getPakeragerSize;**
    
  • 获取清理缓存(小妖)
    1 遍历getCacheDir下的所有文件,计算每个文件的大小即可
    2 清除也是一样,遍历所有文件的大小,删除即可
    3 file.length() 返回的是文件的大小(单位b)

  • 新闻搜索(时间过长)
    1 由于数据过大,应该是服务器那边的, 关键字查询
    2 服务器器会返回相关数据给我
    3 里面的一些数据, 基本是都是html的形式, 已经排好.

  • 评论
    1.没什么作用
    2.发现起始就是头布局压缩啦! 关于他的topBar

  • Android 实现变色状态栏

      // 保留状态的位置
      true
      Google 了之后在 Github 找到了一个开源项目 【SystemBarTint】 
    

Github开源项目 SystemBarTint
自己封装后
// 初始化窗体
@SuppressLint("ResourceAsColor")
@TargetApi(19)
private void initWindow() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

        mTintManager = new SystemBarTintManager(this);     // 色彩管理者
        mColorPicker = new ColorPicker(this);             // 获取颜色采集器
        // mTintManager.setStatusBarTintColor(R.color.main_color);
        mTintManager.setStatusBarTintEnabled(true);     // 设置状态栏可用
        int color = Color.argb(100, 255, 0, 0);         
        mTintManager.setTintColor(color);                 // 设置色彩颜色
    }
   }
  • 关于(结束)

  • 效仿QQ、微信、新浪的圆形头像

    1. 将原图居中裁剪成正方形
  1. 根据指定的宽度对正方形进行缩放
  2. 裁剪成圆形

酒心网###

  • 定位

定位方式#

     gps一种定位方式
     1.wifi定位,IP地址,根据你的IP地址获取你的地理位置,精确度不是特别高了
     2.基站定位,基站就是为电话服务,信号的强弱决定了你离基站的距离,精确度比较高,几十米--几公里,精确度取决于基站的个数

     wifi定位和基站定位局限性:不能定位海拔
     3.gps定位,gps定位卫星进行定位,使用最少卫星实现全球定位,去和       
       gps定位卫星进行通讯来获取定位坐标,通过光波进行通讯,必须得到     
       空旷地方才能进行定位,连接至少需要一分钟,耗电,精确度特别高,不
       需要联网,联网:agps技术,通过联网来修正获取的坐标,特别准确的

       百度定位sdk   gps
       高德  sdk

定位的具体代码

android.permission.ACCESS_MOCK_LOCATION : 模拟位置的权限,模拟器中必须加的,真机可加可不加
android.permission.ACCESS_FINE_LOCATION : 精确位置的权限,真机必须添加
android.permission.ACCESS_COARSE_LOCATION : 大概位置的权限,真机必须添加

passive : 被动,基站定位
gps : gps定位

定位的步骤
1.获取位置的管理者
    //1.获取位置的管理者
    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
2.获取定位方式
    //2.获取定位方式
    //2.1获取所有的定位方式
    //enabledOnly : true : 返回所有可用的定位方式
    List providers = locationManager.getProviders(true);
    for (String string : providers) {
        System.out.println(string);
    }
    //2.2获取最佳的定位方式
    Criteria criteria = new Criteria();
    criteria.setAltitudeRequired(true);//设置是否可以定位海拔,true:可以定位海拔,一定返回gps定位
    //criteria : 设置定位的属性,决定使用什么定位方式的
    //enabledOnly : true : 定位可用的就返回
    String bestProvider = locationManager.getBestProvider(criteria, true);
    System.out.println("最佳的定位方式:"+bestProvider);
3.定位操作
    a.定位
        //provider : 定位方式
        //minTime : 定位的最小时间间隔
        //minDistance : 定位的最小距离间隔
        //listener : LocationListener
        locationManager.requestLocationUpdates(bestProvider, 0, 0, myLocationListener);
    b.LocationListener
        private class MyLocationListener implements LocationListener{
            //当定位位置改变的时候调用
            //location : 当前的位置
            @Override
            public void onLocationChanged(Location location) {
                double latitude = location.getLatitude();//获取纬度,平行
                double longitude = location.getLongitude();//获取经度
                textview.setText("longitude:"+longitude+"   latitude:"+latitude);
            }
            //当定位状态改变的时候调用
            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {
                // TODO Auto-generated method stub
                
            }
            //当定位可用的时候调用
            @Override
            public void onProviderEnabled(String provider) {
                // TODO Auto-generated method stub
                
            }
            //当定位不可用的时候调用
            @Override
            public void onProviderDisabled(String provider) {
                // TODO Auto-generated method stub
                
            }
            
        }
4.关闭gps定位
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //关闭gps定位,高版本中已经不能这么做了,高版本中规定关闭和开启gps必须交由用户自己去实现
        locationManager.removeUpdates(myLocationListener);
    }

 GPS定位城市需要做两个步骤:
 1、取得用户当前位置的经度,纬度。 
 2、根据经纬度转换成城市名称。
    经纬度转换成城市名称,只能使用地图服务了。自己做不来。
    地图服务API有两个,一个是百度地图,一个是谷歌地图。百度地图API    
    调用需要注册百度帐号,并申请APP_KEY,谷歌地图API直接调用即可。

    百度地图API调用地址:
   http://api.map.baidu.com/geocoder?output=json&location=纬度,经度&key=APP_KEY

QuickSideBar

帮助快速查阅对应分组的侧边栏,可以配合任意列表,demo中给出配合RecyclerView(浮动分组使用stickyheadersrecyclerview)。

项目地址:https://github.com/saiwu-bigkoo/Android-QuickSideBar

  • 支付方式

  • 窗体小控件
    View contentView = View.inflate(getApplicationContext(), R.layout.popu_window, null);
    //contentView : 显示view对象
    //width,height : view宽高
    popupWindow = new PopupWindow(contentView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    //4.获取条目的位置,让气泡显示在相应的条目
    int[] location = new int[2];//保存x和y坐标的数组
    view.getLocationInWindow(location);//获取条目x和y的坐标,同时保存到int[]
    //获取x和y的坐标
    int x = location[0];
    int y = location[1];
    //parent : 要挂载在那个控件上
    //gravity,x,y : 控制popuwindow显示的位置
    popupWindow.showAtLocation(parent, Gravity.LEFT | Gravity.TOP, x+50, y);

      隐藏气泡
      /**
       * 隐藏气泡
       */
      private void hidePopuwindow() {
          if (popupWindow != null) {
              popupWindow.dismiss();//隐藏气泡
              popupWindow = null;
          }
      }
    
              //6.设置动画
              //缩放动画
              //前四个 : 控制控件由没有变到有   动画 0:没有    1:整个控件
              //后四个:控制控件是按照自身还是父控件进行变化
              //RELATIVE_TO_SELF : 以自身变化
              //RELATIVE_TO_PARENT : 以父控件变化
              ScaleAnimation scaleAnimation = new ScaleAnimation(0, 1, 0, 1, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0.5f);
              scaleAnimation.setDuration(500);
              
              //渐变动画
              AlphaAnimation alphaAnimation = new AlphaAnimation(0.4f, 1.0f);//由半透明变成不透明
              alphaAnimation.setDuration(500);
              
              //组合动画
              //shareInterpolator : 是否使用相同的动画插补器  true:共享    false:各自使用各自的
              AnimationSet animationSet = new AnimationSet(true);
              //添加动画
              animationSet.addAnimation(scaleAnimation);
              animationSet.addAnimation(alphaAnimation);
              //执行动画
              contentView.startAnimation(animationSet);
      给popuwindow设置背景
      popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    

侧边栏抽屉效果

面试记录_第1张图片
Paste_Image.png

你可能感兴趣的:(面试记录)