导航条

我想实现的效果是这样的

类似于ViewPager的效果,子类导航页面可以滑动,当滑动某个子类导航页面,导航线会平滑地向父类导航移动

·添加布局

  1. <!--导航分类:编程语言/技术文档/源码下载-->
  2. <LinearLayout
  3. android:id="@+id/homepage_nav"
  4. android:layout_width="match_parent"
  5. android:layout_height="wrap_content"
  6. android:orientation="horizontal"
  7. android:layout_below="@+id/vp_homePageAd"
  8. >
  9. <TextView
  10. android:id="@+id/homepage_nav_prog"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:text="编程语言"
  14. android:textSize="17dp"
  15. android:textStyle="bold"
  16. android:layout_weight="1"
  17. android:gravity="center"
  18. />
  19. <TextView
  20. android:id="@+id/homepage_nav_doc"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:text="技术文档"
  24. android:textStyle="bold"
  25. android:layout_weight="1"
  26. android:gravity="center"
  27. />
  28. <TextView
  29. android:id="@+id/homepage_nav_source"
  30. android:layout_width="wrap_content"
  31. android:layout_height="wrap_content"
  32. android:text="源码下载"
  33. android:textStyle="bold"
  34. android:layout_weight="1"
  35. android:gravity="center"
  36. />
  37. </LinearLayout>
  38. <!-- 两条线-->
  39. <View
  40. android:id="@+id/homepage_nav_bottomLine"
  41. android:layout_width="match_parent"
  42. android:layout_height="1dp"
  43. android:layout_below="@+id/homepage_nav"
  44. android:background="#88888888"
  45. android:layout_marginLeft="10dp"
  46. android:layout_marginRight="10dp"/>
  47. <!-- 移动的线-->
  48. <View
  49. android:id="@+id/homepage_nav_moveLine"
  50. android:layout_width="70dp"
  51. android:layout_height="3dp"
  52. android:layout_alignBottom="@+id/homepage_nav_bottomLine"
  53. android:background="#000000" />
  54. <!--导航分类子类, 放在ViewPager中-->
  55. <androidx.viewpager.widget.ViewPager
  56. android:id="@+id/vp_homePageNav"
  57. android:layout_width="match_parent"
  58. android:layout_height="200px"
  59. android:layout_below="@+id/homepage_nav_moveLine"
  60. android:layout_marginTop="20px"/>
  61.  
  62. </RelativeLayout>

·设置ViewPager的滑动页面

页面有若干item组成,每个item按样式是一张图片,下面加文字。那据说有一种比较高级的实现方法,就是外边一个TextView,里面添加图片和文字。TextView里面加图片简单,只要添加android:drawableTop="icon的ID",但是这有一个问题,在尝试用drable.setBounds设置图片的宽高的时候,无效。

这篇文章解决TextView drawableLeft左侧图片大小不可控的问题,提供了一个思路,即自定义一个ImageTextView控件,继承自TextView,重写基类的方法,实现设置往里添加图片的宽,高,位置等。我把java转换成kotlin,再加了一些注释。原程序有bug可以看原文下面的评论。原文还引入了一个DensityUtil的类,作用是实现px和pd的转换,我注释起来了

·在values下添加attrs.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <declare-styleable name="ImageTextView">
  4. <attr name="drawable" format="reference"/>
  5. <attr name="drawableWidth" format="dimension"/>
  6. <attr name="drawableHeight" format="dimension"/>
  7. <attr name="postion" format="integer"/>
  8. </declare-styleable>
  9. </resources>

·新建ImageTextView类

  1. class ImageTextView: TextView {
  2. private var mDrawable: Drawable?=null //资源id
  3. private var mScaleWidth:Int?=null //设置图片宽
  4. private var mScaleHeight:Int?=null //设置图片高
  5. private var mPosition:Int?=null //设置图片位置
  6.  
  7. //初始化基类
  8. constructor(context: Context):super(context){
  9. }
  10. constructor(context: Context, attrs: AttributeSet):super(context,attrs){
  11. init(context,attrs);
  12. }
  13. constructor(context: Context, attrs: AttributeSet, defStyleAttr:Int):super(context, attrs, defStyleAttr){
  14. init(context,attrs);
  15. }
  16.  
  17. //初始化获得xml文件中设置的属性
  18. protected fun init(context: Context, attrs: AttributeSet){
  19. //obtainStyledAttributes获得style中指定资源的属性值,返回typeArray
  20. var typeArray=context.obtainStyledAttributes(attrs, R.styleable.ImageTextView)
  21.  
  22. mDrawable=typeArray.getDrawable(R.styleable.ImageTextView_drawable)
  23. println("在初始化中!!!!!!!")
  24. println(mDrawable)
  25.  
  26. //getDimensionPixelOffset获得指定资源id对应的尺寸,第二个参数,应该是表示如果没有这个属性则返回指定的值
  27. //返回的是绝对尺寸单位,而非相对尺寸,即不是dp/sp。所以第二个参数就需要从dp转换成px,因此用到DensityUtil类
  28. //mScaleHeight=typeArray.getDimensionPixelOffset(R.styleable.ImageTextView_drawableHeight,DensityUtil.dip2px(context,20f))
  29. mScaleHeight=typeArray.getDimensionPixelOffset(R.styleable.ImageTextView_drawableHeight,20)
  30. println("mScaleHeight的值得是多少$mScaleHeight")
  31. mScaleWidth=typeArray.getDimensionPixelOffset(R.styleable.ImageTextView_drawableWidth,20)
  32. println("mScaleWidth的值得是多少$mScaleWidth")
  33. //第二个参数也是设置默认值
  34. mPosition=typeArray.getInt(R.styleable.ImageTextView_postion,3)
  35.  
  36. }
  37.  
  38. //重写TextView的方法onMeasure,这个方法一般用来设置自定义view的尺寸。如果不重写此方法,那么默认尺寸与父控件相同
  39. //
  40. override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
  41. super.onMeasure(widthMeasureSpec, heightMeasureSpec)
  42. println("在设置尺寸中!!!!!!!")
  43. println(mDrawable?.bounds)
  44. //报错 smart cast to X is impossible,because X is a mutable property that could hava been changed by this time
  45. //if(mDrawable!=null){...}
  46. //mDrawable!!.setBounds(0,0,300,300)
  47.  
  48. //DensityUtil.dip2px转换有问题
  49. //mDrawable!!.setBounds(0,0,DensityUtil.dip2px(context,mScaleWidth!!.toFloat()),DensityUtil.dip2px(context,mScaleHeight!!.toFloat()))
  50.  
  51. var scale=context.resources.displayMetrics.density;
  52. var dpScaleHeight:Float=mScaleHeight!!*scale+0.5f
  53. var dpScaleWidth:Float=mScaleWidth!!*scale+0.5f
  54. mDrawable!!.setBounds(0,0,dpScaleWidth!!.toInt(),dpScaleHeight!!.toInt())
  55.  
  56. println(mDrawable?.bounds)
  57. this.setCompoundDrawables(null,mDrawable,null,null)
  58.  
  59. }
  60.  
  61. // override fun onDraw(canvas: Canvas?) {
  62. // super.onDraw(canvas)
  63. // when(mPosition){
  64. // 1->this.setCompoundDrawables(mDrawable,null,null,null)
  65. // 2->this.setCompoundDrawables(null,mDrawable,null,null)
  66. // 3->this.setCompoundDrawables(null,null,mDrawable,null)
  67. // 4->this.setCompoundDrawables(null,null,null,mDrawable)
  68. // }
  69. // }
  70.  
  71. // protected fun setDrawableLeft(drawable: Drawable){
  72. // this.mDrawable=drawable;
  73. // }
  74. //
  75. // protected fun setDrawableLeft(drawableRes:Int,context: Context){
  76. // //
  77. // var mDrawable= ContextCompat.getDrawable(context,R.drawable.ic_php)
  78. // invalidate();
  79. // }
  80.  
  81. }

·在布局中使用ImageTextView

在根布局中添加:

  1. xmlns:tools="http://schemas.android.com/tools"
  2. xmlns:app="http://schemas.android.com/apk/res-auto"

(之后在ImageTextView中使用自定的属性要使用标签<app:> 而不是<android:>

添加布局代码,因为属于ViewPager的滑动页面,所以新建一个fragment_home_nav_program.xml吧

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="wrap_content"
  7. android:orientation="horizontal">
  8.  
  9. <com.vocus.justtest.view.ImageTextView
  10. android:id="@+id/nav_item_php"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:layout_marginLeft="15dp"
  14. android:layout_marginRight="15dp"
  15. android:drawableTop="@drawable/ic_nav_php"
  16. android:gravity="center"
  17. android:text="Php"
  18. app:drawable="@drawable/ic_nav_php"
  19. app:drawableHeight="25dp"
  20. app:drawableWidth="25dp" />
  21.  
  22. <com.vocus.justtest.view.ImageTextView
  23. android:id="@+id/nav_item_c"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. android:layout_marginLeft="15dp"
  27. android:layout_marginRight="15dp"
  28. android:drawableTop="@drawable/ic_nav_c"
  29. android:gravity="center"
  30. android:text="C/c++"
  31. app:drawable="@drawable/ic_nav_c"
  32. app:drawableHeight="25dp"
  33. app:drawableWidth="25dp" />
  34.  
  35. <com.vocus.justtest.view.ImageTextView
  36. android:id="@+id/nav_item_java"
  37. android:layout_width="wrap_content"
  38. android:layout_height="wrap_content"
  39. android:layout_marginLeft="15dp"
  40. android:layout_marginRight="15dp"
  41. android:drawableTop="@drawable/ic_nav_java"
  42. android:gravity="center"
  43. android:text="Java"
  44. app:drawable="@drawable/ic_nav_java"
  45. app:drawableHeight="25dp"
  46. app:drawableWidth="25dp" />
  47.  
  48. <com.vocus.justtest.view.ImageTextView
  49. android:id="@+id/nav_item_python"
  50. android:layout_width="wrap_content"
  51. android:layout_height="wrap_content"
  52. android:layout_marginLeft="15dp"
  53. android:layout_marginRight="15dp"
  54. android:drawableTop="@drawable/ic_nav_python"
  55. android:gravity="center"
  56. android:text="Python"
  57. app:drawable="@drawable/ic_nav_python"
  58. app:drawableHeight="25dp"
  59. app:drawableWidth="25dp" />
  60. </LinearLayout>

·设置导航ViewPager的Adapter,新建HomePageNavAdapter类,这里先随便写一下

  1. class HomePageNavAdapter : PagerAdapter() {
  2. override fun instantiateItem(container: ViewGroup, position: Int): Any {
  3. //return super.instantiateItem(container, position)
  4. when (position) {
  5. 0 -> {
  6. var navView = LayoutInflater.from(container.context)
  7. .inflate(R.layout.fragment_home_nav_program, container, false)
  8. container.addView(navView)
  9. return navView
  10. }
  11. 1 -> {
  12. var textView = TextView(container.context)
  13. textView.text = "第二页..."
  14. container.addView(textView)
  15. return textView
  16. }
  17. 2 -> {
  18. var textView = TextView(container.context)
  19. textView.text = "第三页..."
  20. container.addView(textView)
  21. return textView
  22. }
  23. else ->{
  24. var textView=TextView(container.context)
  25. textView.text="超出范围了"
  26. return textView
  27. }
  28. }
  29.  
  30. }
  31.  
  32. override fun isViewFromObject(view: View, `object`: Any): Boolean {
  33. return view == `object`
  34. }
  35.  
  36. override fun getCount(): Int {
  37. return 3
  38. }
  39.  
  40. override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
  41. container.removeView(`object` as View)
  42. }
  43.  
  44. }

·实现一条导航线跟着Viewpager的页面移动而移动,这篇文章ViewPager 的顶部滑动线 提供了一个思路,就是在viewpager滚动监听中,改变移动线的leftMargin。

我在尝试使用文章提到的方法的时候,遇到了几个问题

·当使用homepage_nav_moveLine.layoutParams.leftMargin获取移动线的leftMargin时,提示

cannot inline bytecide built with JVM target 1.8 into bytecode that is being built with JVM target 1.6

需要在build.grandle中添加

  1. compileOptions {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
    }
  2.  
  3. kotlinOptions {
    jvmTarget = "1.8"
    }

·当给它赋值的时候,提示

val cannot be reassigned

查看.leftMargin方法在View类中的定义

  1. inline val View.marginLeft: Int
    get() = (layoutParams as? MarginLayoutParams)?.leftMargin ?: 0

所以只要改成

  1. homepage_nav_moveLine.layoutParams as ViewGroup.MarginLayoutParams).leftMargin

另外,后面用到手机屏幕的尺寸信息,所以定义一个类ScreenDimen,并把它定义成单例模式。关于带参数的单例模式,参考

  1. class ScreenDimen private constructor(context: Context){
  2. private var context:Context?=null
  3. private var windowManager:WindowManager?=null
  4. private var displayMetrics:DisplayMetrics?=null
  5.  
  6. init{
  7. windowManager=(context.getSystemService(Context.WINDOW_SERVICE) as WindowManager)
  8. displayMetrics= DisplayMetrics()
  9. windowManager!!.defaultDisplay.getMetrics(displayMetrics)
  10. }
  11.  
  12. companion object{
  13. var instance:ScreenDimen?=null
  14.  
  15. fun getInstance(context: Context):ScreenDimen{
  16. if(instance==null){
  17. synchronized(ScreenDimen::class){
  18. if(instance==null){
  19. instance= ScreenDimen(context)
  20. }
  21. }
  22. }
  23. return instance!!
  24. }
  25. }
  26.  
  27. //获得屏幕宽度pixel
  28. fun getScreenWidthPix():Int{
  29. return displayMetrics!!.widthPixels
  30. }
  31.  
  32. //获得宽度pixel
  33. fun getScreenHeightPix():Int{
  34. return displayMetrics!!.heightPixels
  35. }
  36.  
  37. //获取屏幕宽度dp
  38. fun screenWidthDp():Int{
  39. var screenWidthDp=getScreenWidthPix()/displayMetrics!!.density
  40. return screenWidthDp.toInt()
  41. }
  42.  
  43. fun screenHeightDp():Int{
  44. var screenHeightDp=getScreenHeightPix()/displayMetrics!!.density
  45. return screenHeightDp.toInt()
  46. }
  47.  
  48. }

· 最后写成这样了

  1. //加载导航ViewPager
  2. vp_homePageNav.adapter = HomePageNavAdapter()
  3.  
  4. //define a move line
  5. vp_homePageNav.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
  6. private var currentPage: Int? = null
  7. private var screenWidth = ScreenDimen.getInstance(context!!).getScreenWidthPix()//屏幕像素
  8. private var moveLineDefaultLeftMargin = (homepage_nav_moveLine.layoutParams as ViewGroup.MarginLayoutParams).leftMargin
  9.  
  10. override fun onPageScrollStateChanged(state: Int) {
  11. }
  12.  
  13. override fun onPageScrolled(
  14. position: Int, //0,1,2
  15. positionOffset: Float,
  16. positionOffsetPixels: Int
  17. ) {
  18. //有延时
  19. var mvLeftMargin=0
  20. var progLeftMargin=(screenWidth/3-homepage_nav_moveLine.width)/2
  21. var docLetLeftMargin=screenWidth/3+(screenWidth/3-homepage_nav_moveLine.width)/2
  22. var sourceLeftMargin=(screenWidth/3)*2+(screenWidth/3-homepage_nav_moveLine.width)/2
  23.  
  24. when (position) {
  25. 0 -> {
  26. view!!.invalidate()
  27. //homepage_nav_prog.typeface=Typeface.defaultFromStyle(Typeface.BOLD)
  28. mvLeftMargin = progLeftMargin
  29. mvLeftMargin += positionOffsetPixels / 3
  30. (homepage_nav_moveLine.layoutParams as ViewGroup.MarginLayoutParams).leftMargin=mvLeftMargin
  31. }
  32. 1 -> {
  33. view!!.invalidate()
  34. mvLeftMargin=docLetLeftMargin
  35. mvLeftMargin += positionOffsetPixels / 3
  36. (homepage_nav_moveLine.layoutParams as ViewGroup.MarginLayoutParams).leftMargin=mvLeftMargin
  37. }
  38. 2 -> {
  39. view!!.invalidate()
  40. mvLeftMargin =sourceLeftMargin
  41. mvLeftMargin += positionOffsetPixels / 3
  42. (homepage_nav_moveLine.layoutParams as ViewGroup.MarginLayoutParams).leftMargin=mvLeftMargin
  43. }
  44. }
  45.  
  46. }
  47. override fun onPageSelected(position: Int) {
  48. currentPage = position //保存当前所在页面
  49. }
  50.  
  51. })
  52.  
  53. //add new code
  54.  
  55. }

效果不理想,滑动页面,线的移动会延时,而且没有平滑移动

有点乱,应该是我哪里写错了。但是有一种比调整leftMargin更简单的方法,就是使用动画

  1. var positionOffsetPd=ScreenDimen.getInstance(context!!).pixToPd(positionOffsetPixels)
  2.  
  3. ViewCompat.animate(homepage_nav_moveLine).translationX(position*screenWidth/3+positionOffsetPd/3+((screenWidth/3-homepage_nav_moveLine.width))/2+10).setDuration(0)

在onPageScrollStateChanged中positionOffsetPixels是滑动页面的偏移像素,这里把它转换成dp值。positon是第几页

滑动一次页面,会产生一长串的positionOffsetPixels,系统也会多次调用onPageScrollStateChanged函数,每调用一次,就创建一个duration为0的动画(瞬间跳转,相当于平移)

·接着要实现滑动子类导航页面时,改变父类导航的字体为加粗

写在onPageSelected,因为这个函数每滑动翻页一次才被调用一次

  1. override fun onPageSelected(position: Int) {
  2. homepage_nav_prog.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL))
  3. homepage_nav_doc.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL))
  4. homepage_nav_source.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL))
  5. when(position){
  6. 0->{
  7. homepage_nav_prog.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD))
  8. }
  9. 1->{
  10. homepage_nav_doc.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD))
  11. }
  12. 2->{
  13. homepage_nav_source.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD))
  14. }
  15. }
  16. }
·还有个,点击父类导航,应该把viewPager滑动到对应的子类导航页面,那就添加响应事件吧
但是有个问题,如果添加了无限翻页,代码写成这样
  1. homepage_nav_prog.setOnClickListener{
  2. vp_homePageNav.currentItem= Int.MAX_VALUE/2-Int.MAX_VALUE/2%3
  3. }
  4. homepage_nav_doc.setOnClickListener{
  5. vp_homePageNav.currentItem= Int.MAX_VALUE/2-Int.MAX_VALUE/2%3+1
  6. }
  7. homepage_nav_source.setOnClickListener{
  8. vp_homePageNav.currentItem= Int.MAX_VALUE/2-Int.MAX_VALUE/2%3+2
  9. }
 
当翻了很多页的时候,点击按钮,与要跳转到的页面隔了很多页,那么就会很耗时,有人说可以重写setCurrentItem方法,但是我看kotlin把java的setCurrentItem封装了很多层。那想到一个办法
  1. homepage_nav_prog.setOnClickListener{
  2. if(vp_homePageNav.currentItem%3==1){
  3. vp_homePageNav.currentItem-=1
  4. }else if(vp_homePageNav.currentItem%3==2){
  5. vp_homePageNav.currentItem-=2
  6. }
  7.  
  8. }
  9. homepage_nav_doc.setOnClickListener{
  10. if(vp_homePageNav.currentItem%3==0){
  11. vp_homePageNav.currentItem+=1
  12. }else if(vp_homePageNav.currentItem%3==2){
  13. vp_homePageNav.currentItem-=1
  14. }
  15. }
  16. homepage_nav_source.setOnClickListener{
  17. if(vp_homePageNav.currentItem%3==0){
  18. vp_homePageNav.currentItem+=2
  19. }else if(vp_homePageNav.currentItem%3==1){
  20. vp_homePageNav.currentItem+=1
  21. }
  22. }
这样保证跳转是在三个页面之间进行的。再设置vp_homePageNav.offscreenPageLimit=3,表示默认会同时创建3个页面,那切换的时候,是在三个创建好的页面之间,问题就解决了

另外还有子类导航的点击事件没有设置,但是先就这样吧

源码

链接:https://pan.baidu.com/s/1cAkrnFyNhzPyObVX_SkMFw
提取码:qtpk

尝试用kotlin做一个app(二)的更多相关文章

  1. 尝试用kotlin做一个app(写在前面)

    学kotlin的目的好像就是做一个app,不一定有什么想做的项目,只是单纯想掌握这一门技术,确切地说只是单纯想学会做app.对于概念的东西,我也没兴趣深究,用得到的学一下,用不到的,就算了.我也不知道 ...

  2. 尝试用kotlin做一个app(五)

    JSP后台管理系统 开发工具是IntelliJ IDEA+tomcat+mysql5.6.19+mysql-connector-java-5.1.48.jar+easyui+kindeditor 之前 ...

  3. 尝试用kotlin做一个app(一)

    1.先添加一下anko库 依赖:implementation "org.jetbrains.anko:anko:$anko_version" 版本:ext.anko_version ...

  4. 尝试用kotlin做一个app(四)

    本来是应该为主页加载数据库数据了,但是想着做后台,之前写jsp后台写吐了,所以先拖几天.把之前的代码完善一下,或者添加些新内容. ...... 多个fragment切换卡顿 首先修正一个bug.从主页 ...

  5. 尝试用kotlin做一个app(三)

    新闻列表 添加新闻列表可以使用RecyclerView.但是有个问题,RecyclerView只会在内部滚动,不会带动整个屏幕滚动.所以在原根布局外层添加androidx.core.widget.Ne ...

  6. 涨姿势:创业做一个App需要花多少钱(8个人,6个月,就要100万,附笔记心得)

    (原标题:涨姿势:创业做一个App要花多少钱?) 作为互联网从业者,被外行的朋友们问及最多的问题是,“做一个网站需要多少钱?”或者“做一个APP需要多少钱?”. 作为做过完整网站项目和APP的人,今天 ...

  7. 创业成本?亲身经历告诉你做一个app要多少钱

    导语:作为一名苦逼的移动互联网创业者,被外行的朋友们问及最多的问题是“做一个网站需要多少钱?”或者“做一个APP需要多少钱?” 作为一名苦逼的移动互联网创业者,被外行的朋友们问及最多的问题是“做一个网 ...

  8. 做一个 App 前需要考虑的几件事

    做一个 App 前需要考虑的几件事  来源:limboy的博客   随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 ...

  9. 做一个App前需要考虑的几件事

    本文转载于文章原文链接,版本归原作者所有! 随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 App 有了一定规模后, ...

随机推荐

  1. C++字符集和词法记号以及符号常量

    C++字符集 大小写的英文字母:A~Z,a~z 数字符号:0~9 特殊字符:!#%*()等 关键字:C++预定义的单词 标识符:程序员声明的单词,它命名程序正文中的一些实体 文字:在程序中直接使用符号 ...

  2. XV6源代码阅读-文件系统

    Exercise1 源代码阅读 文件系统部分 buf.h fcntl.h stat.h fs.h file.h ide.c bio.c log.c fs.c file.c sysfile.c exec ...

  3. C++中的简单继承

    Father.cpp: #include<iostream> using namespace std; class Father { protected: int width; int h ...

  4. wx地址和腾讯地图

    如果只是要获取当前用户的经纬度和打开微信自带的地图 只需要 jsApiList: ["getLocation","openLocation"] // 先获得 w ...

  5. 6 应用Nginx之后

    以上的问题,涉及到Varnish

  6. Codeforces Forethought Future Cup Elimination Round 选做

    1146C Tree Diameter 题意 交互题.有一棵 \(n(n\le 100)\) 个点的树,你可以进行不超过 \(9\) 次询问,每次询问两个点集中两个不在同一点集的点的最大距离.求树的直 ...

  7. 人脸识别 API Key和Secret Key作用

    App key简称API接口验证序号,是用于验证API接入合法性的.接入哪个网站的API接口,就需要这个网站允许才能够接入,如果简单比喻的话:可以理解成是登陆网站的用户名 App Secret简称AP ...

  8. apache端口修改为80

    apache端口莫名改变为443,访问网址失败,修改Apache端口: 1.打开目录(实际而定): C:\xampp\apache\conf 编辑httpd.conf 2.ctrl + f  搜索li ...

  9. Netty 异步模型

    简介 Netty中的 I/O 操作是异步的, 包括 Bind.Write.Connect 等操作会简单的返回一个ChannelFuture. 调用者不能立刻获得结果, 而是通过Future-Liste ...

  10. 如何形成自己的的绘画风格?/ Bookness插画教程分享

    搬运地址 :http://wemedia.ifeng.com/46042525/wemedia.shtml ---------------------------------------------- ...