上次的功能完成了英雄名字、id、头像的下载并使用RecyclerView展示,

所以接下来就是点击每个英雄的caraview就能打开下一个活动进行英雄的介绍。先打开暴雪的官网查看有那些技能、故事、图片可供下载。首先是http://ow.blizzard.cn/heroes/

如果我想要看源氏的详细介绍,点击之后就打开了http://ow.blizzard.cn/heroes/genji,可以发现比上一个网站多了一个genji,genji就是源氏英文名也是上次获得的id。

详细介绍中有:

概况:角色类型 技能 攻击简介

故事:英雄简介,台词,背景故事

然后是html代码的分析了,大概想要的内容可分为三个部分:

1、英雄图片

这个src="http://overwatch.nos.netease.com/1/assets/images/hero/genji/full-portrait.png"可以得到英雄的全身照片.png

2、技能、角色类型

3、故事

所以相应的代码就是:

    Elements elements1 = doc.select(".hero-image"); //读取图片urlElements elements2 = doc.select(".h2,.hero-detail-role-name"); //角色类型Elements elements3 = doc.select(".hero-ability"); //读取技能Elements elements4 = doc.select(".h5");//读取技能名字Elements elements5 = doc.select(".hero-ability-descriptor");//读取技能描述Elements elements6 = doc.select(".hero-detail-description");//读取英雄描述Elements elements7 = doc.select(".hero-bio-copy");//读取英雄简介Elements elements8 = doc.select(".h4,.hero-detail-title");//读取英雄台词Elements elements9 = doc.select(".hero-bio-backstory");//读取英雄故事

大概分析就结束了,然后就是活动布局的设定了,

这部分的布局首先是一个可折叠的标题栏用于展示英雄图片,然后是一个可滑动切换的标签栏用于概况和故事的切换。

然后viewpager中将是两个Fragment分别展示概况和故事。

xml代码分别是:

活动的:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"><android.support.design.widget.AppBarLayoutandroid:id="@+id/appbar"android:layout_width="match_parent"android:layout_height="250dp"android:fitsSystemWindows="true"android:background="@drawable/timg2"><android.support.design.widget.CollapsingToolbarLayoutandroid:id="@+id/collaping_toobar"android:layout_width="match_parent"android:layout_height="210dp"android:fitsSystemWindows="true"android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"app:contentScrim="@drawable/img2"app:layout_scrollFlags="scroll|exitUntilCollapsed"><ImageViewandroid:id="@+id/hero_image_view"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"android:scaleType="centerInside"app:layout_collapseMode="parallax" /><android.support.v7.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"app:layout_collapseMode="pin" /></android.support.design.widget.CollapsingToolbarLayout><android.support.design.widget.TabLayoutandroid:id="@+id/tablayout"android:layout_width="match_parent"android:layout_height="wrap_content"app:tabIndicatorColor="#00C3FF"app:layout_anchorGravity="bottom"app:tabBackground="@android:color/white"/></android.support.design.widget.AppBarLayout><android.support.v4.widget.NestedScrollViewandroid:layout_width="match_parent"android:layout_height="wrap_content"app:layout_behavior="@string/appbar_scrolling_view_behavior"><xbt.exp22.WrapContentHeightViewPagerandroid:id="@+id/viewpager"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:background="@android:color/white"/></android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

概况:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginBottom="15dp"android:orientation="vertical"android:background="#6B778E"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:layout_marginLeft="15dp"android:text="角色类型"android:textSize="35sp"android:textColor="#00C3FF"android:textStyle="bold|italic" /><TextViewandroid:id="@+id/hero_style"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="15dp"android:textSize="45sp"android:textColor="#F0EDF2"android:textStyle="bold|italic" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:layout_marginLeft="20dp"><ImageViewandroid:layout_width="5dp"android:layout_height="120dp"android:background="#00C3FF"/><TextViewandroid:id="@+id/heroSmileDescriptor"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:layout_marginLeft="10dp"android:textColor="#F0EDF2"/></LinearLayout></LinearLayout><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:layout_marginLeft="15dp"android:text="技能"android:textSize="35sp"android:textColor="#00C3FF"android:textStyle="bold|italic" /><LinearLayoutandroid:id="@+id/skill_layout"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"></LinearLayout></LinearLayout>

故事:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background="#6B778E"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:layout_marginLeft="15dp"android:text="简介"android:textSize="35sp"android:textColor="#00C3FF"android:textStyle="bold|italic" /><TextViewandroid:id="@+id/hero1"android:layout_marginTop="10dp"android:layout_marginLeft="30dp"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="#F0EDF2" /><TextViewandroid:id="@+id/hero2"android:layout_marginTop="10dp"android:layout_marginLeft="30dp"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="#F0EDF2" /><TextViewandroid:id="@+id/hero3"android:layout_marginTop="10dp"android:layout_marginLeft="30dp"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="#F0EDF2" /><TextViewandroid:id="@+id/hero4"android:layout_marginTop="10dp"android:layout_marginLeft="30dp"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="#F0EDF2" /><TextViewandroid:id="@+id/hero5"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:layout_marginLeft="50dp"android:textSize="30sp"android:textColor="#00C3FF"android:textStyle="bold|italic" /><TextViewandroid:id="@+id/hero6"android:layout_marginLeft="35dp"android:layout_marginRight="10dp"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="20dp"android:background="#516080"android:textColor="#F0EDF2" /></LinearLayout>

然后就是java代码的编写了,首先要解决布局中一个很严重的问题viewpager和NestedScrollView是有冲突的,所以新建了一个WrapContentHeightViewPager类继承自ViewPager重写了onMeasure方法(这段是网上人家的代码,但是现在我找不到来源了==),

public class WrapContentHeightViewPager extends ViewPager {public WrapContentHeightViewPager(Context context) {super(context);}public WrapContentHeightViewPager(Context context, AttributeSet attrs) {super(context, attrs);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int height = 0;for (int i = 0; i < getChildCount(); i++) {View child = getChildAt(i);child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));int h = child.getMeasuredHeight();if (h > height) height = h;}heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);super.onMeasure(widthMeasureSpec, heightMeasureSpec);}
}

活动的java代码:

public class HeroDetails extends AppCompatActivity {

    public static final String Hero_NAME = "hero_name";

    public static final String Hero_ID = "hero_id";

    private Handler handler;

    String imgUrl;

    private List<HeroSkill> heroSkillList = new ArrayList<>();

    private List<String> list_title;    private List<Fragment> list_fragment;

    private FragmentAdapter fAdapter;

    private SkillFragment nFragment;    private Fragment2 sFragment;

    private TabLayout tab_title;    private ViewPager vp_pager;

    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_hero_details);

        Intent intent = getIntent();        final String heroName =intent.getStringExtra(Hero_NAME);        String heroId =intent.getStringExtra(Hero_ID);        String url = "http://ow.blizzard.cn/heroes/" + heroId;

        //标题栏设定        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);        setSupportActionBar(toolbar);

        //设置标题栏标题        CollapsingToolbarLayout collapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.collaping_toobar);        collapsingToolbar.setTitle(heroName);        collapsingToolbar.setExpandedTitleColor(Color.parseColor("#00C3FF") );        collapsingToolbar.setCollapsedTitleTextColor(Color.parseColor("#00C3FF") );

        //让返回图标显示出来        ActionBar actionBar = getSupportActionBar();        if(actionBar != null){            actionBar.setDisplayHomeAsUpEnabled(true);        }

        initHeroes(url);        handler = new Handler(){            @Override            public void handleMessage(Message msg) {                if(msg.what == 1){                    ImageView overWatchImageView = (ImageView) findViewById(R.id.hero_image_view);                    Glide.with(HeroDetails.this).load(imgUrl).into(overWatchImageView);                    tab_title = (TabLayout)findViewById(R.id.tablayout);                    vp_pager = (ViewPager)findViewById(R.id.viewpager);                    fragmentChange();                }            }        };    }

    //读取数据    private void initHeroes(String Url){        HttpUtil.sendOkHttpRequest(Url, new Callback() {            @Override            public void onResponse(Call call, Response response) throws IOException {                final String responseText = response.body().string();                new Thread(new Runnable() {                    @Override                    public void run() {                        Document doc = Jsoup.parse(responseText);//将String类型的html转换为Document                        Elements elements1 = doc.select(".hero-image"); //读取图片url                        Elements elements2 = doc.select(".h2,.hero-detail-role-name"); //角色类型                        Elements elements3 = doc.select(".hero-ability"); //读取技能                        Elements elements4 = doc.select(".h5");//读取技能名字                        Elements elements5 = doc.select(".hero-ability-descriptor");//读取技能描述                        Elements elements6 = doc.select(".hero-detail-description");//读取英雄描述                        Elements elements7 = doc.select(".hero-bio-copy");//读取英雄简介                        Elements elements8 = doc.select(".h4,.hero-detail-title");//读取英雄台词                        Elements elements9 = doc.select(".hero-bio-backstory");//读取英雄故事

                        Log.d("message", elements9.text());                        List<String> heroBio = new ArrayList<String>();

                        for(int i= 0; i < elements7.size(); i++) {                            heroBio.add(elements7.get(i).text());                        }                        heroBio.add(elements8.get(6).text());                        heroBio.add(elements9.text());

                        imgUrl = elements1.attr("src");

                        for(int j = 0; j < elements4.size(); j++ ) {                            String skillImgUrl = elements3.select("img").get(j).attr("src");                            String skillName = elements4.get(j).text();                            String skillDescriptor = elements5.get(j).select("p").text();                            HeroSkill heroSkill = new HeroSkill(skillImgUrl,skillName,skillDescriptor,elements2.text(),elements6.text(),heroBio);                            heroSkillList.add(heroSkill);                        }                        Message msg = new Message();                        msg.what = 1;                        handler.sendMessage(msg);                    }                }).start();            }

            @Override            public void onFailure(Call call, IOException e) {                e.printStackTrace();                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        Toast.makeText(HeroDetails.this, "数据获取失败", Toast.LENGTH_SHORT).show();                    }                });            }        });    }

    //点击左上角的返回后退出活动    public boolean onOptionsItemSelected(MenuItem item){        switch (item.getItemId()){            case android.R.id.home:                finish();                return true;        }        return super.onOptionsItemSelected(item);    }

    //用于和Fragment的通信    public List<HeroSkill> getHeroSkillList(){        return heroSkillList;    }

    private void fragmentChange()    {        list_fragment = new ArrayList<>();

        nFragment = new SkillFragment();        sFragment = new Fragment2();

        list_fragment.add(nFragment);        list_fragment.add(sFragment);

        list_title = new ArrayList<>();        list_title.add("技能");        list_title.add("概况");

        fAdapter = new FragmentAdapter(getSupportFragmentManager(),list_fragment,list_title);        vp_pager.setAdapter(fAdapter);

        //将tabLayout与viewpager连起来        tab_title.setupWithViewPager(vp_pager);    }}

这里新建的HeroSkill类:

public class HeroSkill {private String skillImg;private String skillName;private String skillDescriptor;private String heroStyle;private String heroSmileDescriptor;private List<String> heroBio;public HeroSkill(String skillImg, String skillName,String skillDescriptor,String heroStyle, String heroSmileDescriptor,List<String> heroBio ) {this.skillDescriptor = skillDescriptor;this.skillImg = skillImg;this.skillName = skillName;this.heroStyle = heroStyle;this.heroSmileDescriptor = heroSmileDescriptor;this.heroBio = heroBio;}public String getSkillImg() {return skillImg;}public void setSkillImg(String skillImg) {this.skillImg = skillImg;}public String getSkillName() {return skillName;}public void setSkillName(String skillName) {this.skillName = skillName;}public String getSkillDescriptor() {return skillDescriptor;}public void setSkillDescriptor(String skillDescriptor) {this.skillDescriptor = skillDescriptor;}public String getHeroStyle() {return heroStyle;}public void setHeroStyle(String heroStyle) {this.heroStyle = heroStyle;}public String getHeroSmileDescriptor() {return heroSmileDescriptor;}public void setHeroSmileDescriptor(String heroSmileDescriptor) {this.heroSmileDescriptor = heroSmileDescriptor;}public List<String> getHeroBio() {return heroBio;}public void setHeroBio(List<String> heroBio) {this.heroBio = heroBio;}
}

然后还有两个fragment的代码,还有连接fragment TabLayout ViewPager的FragmentAdapter继自FragmentPagerAdapter。就不贴了。。

全部的源代码在这https://github.com/xbtshady/Exp22

预览:

  

转载于:https://www.cnblogs.com/xxbbtt/p/7625792.html

守望先锋app(2)相关推荐

  1. 守望先锋app(1)

    这个app就是从守望先锋的官网下载相关的图片.文字.视频然后展示出来. 第一个功能是英雄介绍,所以先分析一波官网的数据.守望先锋的英雄数据的官方网站是http://ow.blizzard.cn/her ...

  2. 《守望先锋》中的末日铁拳是怎么摧毁玩家体验的?

    本文约3600字,阅读需要约15分钟,内容有: 上勾拳是什么 守望先锋的战斗机制和体验 不可能三角和OPF理论 玩家行为闭环 铁拳是怎样在游戏中"作恶"的 总结 一.前言 什么?都 ...

  3. 分享基本书,Unity Shader入门精要、PBR_Guide_Vol1_中文版、PBR_Guide_Vol2_中文版、PBR守望先锋猎风, substance painter制作

    Unity Shader入门精要 PBR_Guide_Vol1_中文版 PBR_Guide_Vol2_中文版 PBR守望先锋猎风, substance painter制作 百度链接,自取 链接:htt ...

  4. 有趣!机器学习预测《守望先锋》里的赢家

    网络游戏及电竞流媒体业务正在崛起为一个巨大的市场.在去年的英雄联盟世界锦标赛中,仅一场半决赛就有高达 1.06 亿人观看,甚至超过了 2018 年"超级碗"的观看人数.另一个成功的 ...

  5. 使用机器学习预测电子竞技游戏《守望先锋》的胜负

    摘要: 机器学习可以预测游戏的输赢?来看看Bowen Yang博士是如何构建这一模型的. <守望先锋>中的英雄 来自加州大学河滨分校的物理学博士学位的Bowen Yang正在致力于构建一个 ...

  6. mugen4g补丁如何使用_《守望先锋联赛》宣布采用英雄池机制及游戏补丁更新方式详解...

    每个主场周末中,将会有一个重装英雄.一个支援英雄和两个输出英雄无法选择使用. 在我们今天发布的<开发者访谈>中提到,<守望先锋>竞技比赛的第21赛季将首次启用英雄池机制.在英雄 ...

  7. 昔日网瘾少年,现在用AI教你打守望先锋

    李杉 编译整理 量子位 出品 | 公众号 QbitAI 最近,一群被调侃为"网瘾少年"的LOL选手火了,他们在亚运会表演赛上拿下了冠军. 也是在最近,身在旧金山的一群网瘾少年,走出 ...

  8. 8 更新全局变量_2月26日守望先锋版本更新

    综合更新 新功能:英雄池 从竞技比赛的第21赛季开始,我们将加入英雄池机制.和地图池一样,并非所有英雄都可随时上阵,每周的可用英雄列表都会变化,每周的列表将包含阵容中的大部分英雄,仅有少数几位英雄将无 ...

  9. 【ShaderLab实例笔记】Overwatch Shield - 守望先锋护盾特效制作笔记

    教程链接:Overwatch Shield 项目链接:OverwatchShieldTemplate Pipeline & Shader:Built-in,Unlit 本文是对 Overwat ...

  10. 守望先锋的蜂窝盾制作

    守望先锋的蜂窝盾制作 转载自Lexdev教程 https://lexdev.net/tutorials/case_studies/overwatch_shield.html

最新文章

  1. Nginx 性能调优实战
  2. spring mvc项目中利用freemarker生成自定义标签
  3. 服务器多个网站开启quarz,GitHub - WuLex/QuartzSynchroData: 多个不同站点服务器数据同步到总服务器(数据中心)...
  4. 解决neo4j导入数据时报错:neo4j already contains data, cannot do import here报错
  5. ASP.NET MVC多语言 仿微软网站效果(转)
  6. KDD2021 | 推荐系统中利用深度哈希方法学习类别特征表示
  7. php使用使用外部变量的值,PHP实现函数内修改外部变量值的方法示例
  8. fgets 和gets_C编程中的fgets()和gets()
  9. CREO学习笔记【常见表面处理工艺】
  10. matlab一维插值extrap,matlab一维插值函数
  11. 行情 api php,股票实时数据接口说明,股票实时行情api接口
  12. User-Agent for Chrome浏览器模拟微信功能
  13. 第16课:迁移学习的模型训练
  14. 量化投资学习——中证500期现套利
  15. SDNU_ACM_ICPC_2019_Winter_Practice_9th题解
  16. 解答03:Smith圆为什么能“上感下容 左串右并”?
  17. springboot基于java的基金分析系统的设计与实现
  18. 【0049】报错:fe_sendauth: invalid authentication request from server: AUTH_REQ_SASL_CONT without
  19. 中国移动光猫GM 219-S获取管理员密码
  20. 企业级解决SQL注入、XSS攻击解决案例

热门文章

  1. VC707开发板的IIC控制
  2. 2021编程语言排行榜出炉
  3. UVALive - 5857 Captain Q's Treasure
  4. Wing-新一代百度大数据查询引擎
  5. Python中的角度转换功能
  6. html谷歌浏览器实现自动播报语音,vue中解决chrome浏览器自动播放音频 和MP3语音打包到线上...
  7. 一分钟快速制作电子签名
  8. MFC API 设置Excel单元格格式
  9. python合并两列数据_python将两列合并
  10. oracle标准成本的维护,Oracle标准成本计算和平均成本计算比较