需求记录(共享元素)
MainActivity1 列表展示,使用共享元素完成页面间的切换
package com.example.animactivity;import android.annotation.SuppressLint;
import android.app.ActivityOptions;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.transition.ChangeBounds;
import android.transition.Fade;
import android.transition.TransitionSet;
import android.view.View;
import android.widget.ImageView;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.app.ActivityOptionsCompat;
import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.listener.OnItemClickListener;import java.util.ArrayList;public class MainActivity1 extends AppCompatActivity {private RecyclerView main1_rv;private Img1Adapter img1Adapter;private ArrayList<Bean> img_list;@SuppressLint("MissingInflatedId")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);main1_rv = findViewById(R.id.main1_rv);initData();img1Adapter = new Img1Adapter(getApplicationContext(), R.layout.main1_item_layout, img_list);main1_rv.setLayoutManager(new LinearLayoutManager(this));main1_rv.setAdapter(img1Adapter);ActivityCompat.startPostponedEnterTransition(this);img1Adapter.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(@NonNull BaseQuickAdapter<?, ?> baseQuickAdapter, @NonNull View view, int i) {ImageView img1 = view.findViewById(R.id.img1);jumpToNextActivity(img1, img_list.get(i));}});}private void initData() {img_list = new ArrayList<>();img_list.add(new Bean(R.drawable.img, "name0"));img_list.add(new Bean(R.drawable.img1, "name1"));img_list.add(new Bean(R.drawable.img2, "name2"));img_list.add(new Bean(R.drawable.img3, "name3"));img_list.add(new Bean(R.drawable.img4, "name4"));img_list.add(new Bean(R.drawable.img5, "name5"));img_list.add(new Bean(R.drawable.img6, "name6"));img_list.add(new Bean(R.drawable.img7, "name7"));img_list.add(new Bean(R.drawable.img8, "name8"));img_list.add(new Bean(R.drawable.img9, "name9"));img_list.add(new Bean(R.drawable.img10, "name10"));}/*** 共享元素跳转** @param img1*/private void jump(ImageView img1) {Intent intent = new Intent(MainActivity1.this, MainActivity2.class);ActivityOptionsCompat sharedElement = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity1.this, img1, "shared element");startActivity(intent, sharedElement.toBundle());}/*** 给跳转设置时间** @param img1* @param data*/private void jumpToNextActivity(ImageView img1, Bean data) {// 创建一个TransitionSet,包含了Fade和ChangeBounds两种过渡效果TransitionSet transition = new TransitionSet().addTransition(new Fade(Fade.OUT)).addTransition(new ChangeBounds()).addTransition(new Fade(Fade.IN));
// 设置过渡时间为500毫秒transition.setDuration(500);
// 应用过渡到Activity或Fragment的共享元素ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(MainActivity1.this, img1, "shared element");
// 启动另一个ActivityIntent intent = new Intent(MainActivity1.this, MainActivity2.class);intent.putExtra("data_imgId", data.imgId);intent.putExtra("data_imgDes", data.imgDes);ActivityCompat.startActivity(MainActivity1.this, intent, options.toBundle());}
}
activity_main
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center"tools:context=".MainActivity1"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/main1_rv"android:layout_width="match_parent"android:layout_height="match_parent" /></FrameLayout>
MainActivity2(主要是查看跳转过来的元素)
package com.example.animactivity;import android.annotation.SuppressLint;
import android.app.ActivityOptions;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.graphics.Typeface;
import android.os.Bundle;
import android.transition.ChangeBounds;
import android.transition.Fade;
import android.transition.Slide;
import android.transition.TransitionSet;
import android.view.GestureDetector;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.app.ActivityCompat;
import androidx.core.app.ActivityOptionsCompat;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;import java.util.ArrayList;public class MainActivity2 extends AppCompatActivity implements View.OnClickListener {private GestureDetector mGestureDetector;private ImageView img2;private TabLayout tabLayout;private ViewPager2 viewPager2;private AppBarLayout appBarLayout;private TabLayoutMediator mediator;private ArrayList<TestFragment> testFragments;private TextView head_tv;private ConstraintLayout layout_header;private int dataImgId;private String dataImgDes;@SuppressLint("MissingInflatedId")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);Intent intent = getIntent();if (intent != null) {dataImgId = intent.getIntExtra("data_imgId", R.id.img1);dataImgDes = intent.getStringExtra("data_imgDes");}img2 = findViewById(R.id.img2);img2.setImageDrawable(getDrawable(dataImgId));img2.setOnClickListener(this);head_tv = findViewById(R.id.head_tv);head_tv.setText(dataImgDes);tabLayout = findViewById(R.id.tab_layout);viewPager2 = findViewById(R.id.view_pager);appBarLayout = findViewById(R.id.appBarLayout);layout_header = findViewById(R.id.layout_header);layout_header.setOnScrollChangeListener(new View.OnScrollChangeListener() {@Overridepublic void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {if (scrollY - oldScrollY > 100) {
// // 用户向下滑动
// jumpTo();Toast.makeText(MainActivity2.this, "下滑了", Toast.LENGTH_SHORT).show();jumpToNextActivity();}}});initViewPager();appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {@Overridepublic void onOffsetChanged(AppBarLayout appBarLayout, int i) {if (i == 0) {if (tabLayout.getVisibility() == View.VISIBLE) {tabLayout.setVisibility(View.GONE);appBarLayout.setLiftOnScrollTargetView(layout_header);}} else {if (tabLayout.getVisibility() == View.GONE) {tabLayout.setVisibility(View.VISIBLE);}}}});// 创建一个GestureDetector实例mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {// 在这里处理下滑手势逻辑
// if (e1.getY() - e2.getY() > 100 && Math.abs(velocityY) > 200) {
// // 处理下滑手势
// Toast.makeText(MainActivity2.this, "下滑手势", Toast.LENGTH_SHORT).show();
// return true;
// }return false;}@Overridepublic boolean onScroll(@Nullable MotionEvent e1, @NonNull MotionEvent e2, float distanceX, float distanceY) {if (e2.getY() - e1.getY() > 100) {
// // 用户向下滑动
// jumpTo();jumpToNextActivity();return true;}return false;}});ActivityCompat.startPostponedEnterTransition(this);}private void initViewPager() {final String[] tabs = new String[]{"关注", "推荐", "最新0"};testFragments = new ArrayList<>();for (String tab : tabs) {testFragments.add(TestFragment.newInstance(tab));}//禁用预加载viewPager2.setOffscreenPageLimit(ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT);//AdapterviewPager2.setAdapter(new FragmentStateAdapter(getSupportFragmentManager(), getLifecycle()) {@NonNull@Overridepublic Fragment createFragment(int position) {//FragmentStateAdapter内部自己会管理已实例化的fragment对象。// 所以不需要考虑复用的问题return testFragments.get(position);}@Overridepublic int getItemCount() {return testFragments.size();}});//viewPager 页面切换监听监听viewPager2.registerOnPageChangeCallback(changeCallback);mediator = new TabLayoutMediator(tabLayout, viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {@Overridepublic void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {tab.setText(tabs[position]);}});//要执行这一句才是真正将两者绑定起来mediator.attach();}private int chosePosition = 0;private ViewPager2.OnPageChangeCallback changeCallback = new ViewPager2.OnPageChangeCallback() {@Overridepublic void onPageSelected(int position) {//可以来设置选中时tab的大小testFragments.get(position).setOnMyItemClickListener(new TestFragment.OnMyItemClickListener() {@Overridepublic void setItemPostion(String type, int position, Bean data) {chosePosition = position;head_tv.setText(type + "===" + data.imgDes);img2.setImageDrawable(getDrawable(data.imgId));}});}};private void jumpTo() {Intent intent = new Intent(MainActivity2.this, MainActivity3.class);
// ViewCompat.setTransitionName(img2, "shared element");ActivityOptionsCompat sharedElement = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity2.this, img2, "shared element");// TransOneActivity, 启动方法没变;startActivity(intent,sharedElement.toBundle());}private void jumpToNextActivity() {ArrayList<Bean> allData = testFragments.get(0).getAllData();allData.add(0, allData.get(chosePosition));// 创建一个TransitionSet,包含了Fade和ChangeBounds两种过渡效果TransitionSet transition = new TransitionSet().addTransition(new Fade(Fade.OUT)).addTransition(new ChangeBounds()).addTransition(new Fade(Fade.IN));
// 设置过渡时间为500毫秒transition.setDuration(500);
// 应用过渡到Activity或Fragment的共享元素ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(MainActivity2.this, img2, "shared element");
// 启动另一个ActivityIntent intent = new Intent(MainActivity2.this, MainActivity3.class);intent.putExtra("all_data", allData);intent.putExtra("chose_position", chosePosition);ActivityCompat.startActivity(MainActivity2.this, intent, options.toBundle());}@Overrideprotected void onDestroy() {super.onDestroy();}@Overridepublic void onClick(View v) {if (v.getId() == R.id.img2) {jumpToNextActivity();}}
}
activity_main2
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity2"><ImageViewandroid:id="@+id/img2"android:layout_width="match_parent"android:layout_height="300dp"android:scaleType="fitXY"android:src="@drawable/img2"android:transitionName="shared element"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><androidx.coordinatorlayout.widget.CoordinatorLayoutandroid:layout_width="match_parent"android:layout_height="0dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@id/img2"><com.google.android.material.appbar.AppBarLayoutandroid:id="@+id/appBarLayout"android:layout_width="match_parent"android:layout_height="wrap_content"><com.google.android.material.appbar.CollapsingToolbarLayoutandroid:id="@+id/collapsingToolbar"android:layout_width="match_parent"android:layout_height="match_parent"app:expandedTitleMarginEnd="0dp"app:expandedTitleMarginStart="0dp"app:expandedTitleMarginTop="?attr/actionBarSize"app:layout_scrollFlags="scroll|exitUntilCollapsed"><includeandroid:id="@+id/layout_header"layout="@layout/layout_header"app:layout_collapseMode="parallax" /></com.google.android.material.appbar.CollapsingToolbarLayout></com.google.android.material.appbar.AppBarLayout><androidx.viewpager2.widget.ViewPager2android:id="@+id/view_pager"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"app:layout_behavior="@string/appbar_scrolling_view_behavior" /></androidx.coordinatorlayout.widget.CoordinatorLayout><com.google.android.material.tabs.TabLayoutandroid:id="@+id/tab_layout"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:visibility="gone"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@id/img2"app:tabGravity="center"app:tabIndicatorColor="#ff678f"app:tabIndicatorFullWidth="false"app:tabIndicatorHeight="2dp"app:tabMode="scrollable"app:tabSelectedTextColor="#ff678f"app:tabTextColor="#333333"app:tabUnboundedRipple="true" />
</androidx.constraintlayout.widget.ConstraintLayout>
package com.example.animactivity;import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.listener.OnItemClickListener;import java.util.ArrayList;/*** @Description* @Author xudan* @CreateTime 2024/4/22*/
public class TestFragment extends Fragment implements OnItemClickListener {private View rootView;private RecyclerView rv;private MyAdapter myAdapter;private String fragment_type;public static TestFragment newInstance(String text) {Bundle args = new Bundle();args.putString("text", text);TestFragment fragment = new TestFragment();fragment.setArguments(args);return fragment;}@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {fragment_type = getArguments().getString("text");rootView = inflater.inflate(R.layout.fragment_test, container, false);rv = rootView.findViewById(R.id.rv);rv.setLayoutManager(new LinearLayoutManager(getContext()));initData();myAdapter = new MyAdapter(getActivity(), R.layout.rv_layout_item, img_list);rv.setAdapter(myAdapter);myAdapter.setOnItemClickListener(this);return rootView;}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);TextView textView = rootView.findViewById(R.id.text_view);String text = getArguments() != null ? getArguments().getString("text") : null;textView.setText(text);}private ArrayList<Bean> img_list;private void initData() {img_list = new ArrayList<>();img_list.add(new Bean(R.drawable.img, "name0"));img_list.add(new Bean(R.drawable.img1, "name1"));img_list.add(new Bean(R.drawable.img2, "name2"));img_list.add(new Bean(R.drawable.img3, "name3"));img_list.add(new Bean(R.drawable.img4, "name4"));img_list.add(new Bean(R.drawable.img5, "name5"));img_list.add(new Bean(R.drawable.img6, "name6"));img_list.add(new Bean(R.drawable.img7, "name7"));img_list.add(new Bean(R.drawable.img8, "name8"));img_list.add(new Bean(R.drawable.img9, "name9"));img_list.add(new Bean(R.drawable.img10, "name10"));}@Overridepublic void onItemClick(@NonNull BaseQuickAdapter<?, ?> baseQuickAdapter, @NonNull View view, int i) {if (onMyItemClickListener != null) {onMyItemClickListener.setItemPostion(fragment_type, i, img_list.get(i));}}private OnMyItemClickListener onMyItemClickListener;public void setOnMyItemClickListener(OnMyItemClickListener onMyItemClickListener) {this.onMyItemClickListener = onMyItemClickListener;}public ArrayList<Bean> getAllData() {return img_list;}public interface OnMyItemClickListener {void setItemPostion(String type, int postion, Bean data);}
}
fragment_test
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center"><TextViewandroid:id="@+id/text_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:background="#DC9494"android:gravity="center"android:textSize="18sp" /><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rv"android:layout_width="match_parent"android:layout_height="match_parent" />
</FrameLayout>
MainActivity3(实现类似于抖音效果的滑动)
package com.example.animactivity;import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Bundle;
import android.view.Window;
import android.widget.Toast;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;import java.util.ArrayList;public class MainActivity3 extends AppCompatActivity {private ViewPager2 main3_vp2;private ArrayList<Bean> list;private int chosePosition;@SuppressLint("MissingInflatedId")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main3);list = (ArrayList<Bean>) getIntent().getSerializableExtra("all_data");chosePosition = getIntent().getIntExtra("chose_position", 0);ActivityCompat.startPostponedEnterTransition(this);main3_vp2 = findViewById(R.id.main3_vp2);main3_vp2.setAdapter(new FragmentStateAdapter(this) {@NonNull@Overridepublic Fragment createFragment(int position) {return DetialFragment.newInstance(list.get(position));}@Overridepublic int getItemCount() {return list.size();}});main3_vp2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {super.onPageScrolled(position, positionOffset, positionOffsetPixels);}@Overridepublic void onPageSelected(int position) {super.onPageSelected(position);Toast.makeText(MainActivity3.this, "切换到第" + position + "个", Toast.LENGTH_SHORT).show();}@Overridepublic void onPageScrollStateChanged(int state) {super.onPageScrollStateChanged(state);}});}}
activity_main3
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity3"><androidx.viewpager2.widget.ViewPager2android:id="@+id/main3_vp2"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" />
</FrameLayout>
关于上述:要点如下:
共享元素切换
private void jumpToNextActivity(ImageView img1, Bean data) {// 创建一个TransitionSet,包含了Fade和ChangeBounds两种过渡效果TransitionSet transition = new TransitionSet().addTransition(new Fade(Fade.OUT)).addTransition(new ChangeBounds()).addTransition(new Fade(Fade.IN));
// 设置过渡时间为500毫秒transition.setDuration(500);
// 应用过渡到Activity或Fragment的共享元素ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(MainActivity1.this, img1, "shared element");
// 启动另一个ActivityIntent intent = new Intent(MainActivity1.this, MainActivity2.class);intent.putExtra("data_imgId", data.imgId);intent.putExtra("data_imgDes", data.imgDes);ActivityCompat.startActivity(MainActivity1.this, intent, options.toBundle());}
使用TabLayout+Viewpager时,注意页面切换监听监听
viewPager2.registerOnPageChangeCallback(changeCallback);mediator = new TabLayoutMediator(tabLayout, viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {@Overridepublic void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {tab.setText(tabs[position]);}});//要执行这一句才是真正将两者绑定起来mediator.attach();
private ViewPager2.OnPageChangeCallback changeCallback = new ViewPager2.OnPageChangeCallback() {@Overridepublic void onPageSelected(int position) {//可以来设置选中时tab的大小testFragments.get(position).setOnMyItemClickListener(new TestFragment.OnMyItemClickListener() {@Overridepublic void setItemPostion(String type, int position, Bean data) {chosePosition = position;head_tv.setText(type + "===" + data.imgDes);img2.setImageDrawable(getDrawable(data.imgId));}});
单纯的梳理逻辑,所以demo中的图片加载没有做任何处理,有大图加载可能会导致oom,所以有针对的了解哈
相关文章:
需求记录(共享元素)
MainActivity1 列表展示,使用共享元素完成页面间的切换 package com.example.animactivity;import android.annotation.SuppressLint; import android.app.ActivityOptions; import android.content.Intent; import android.os.Build; import android.os.Bundle; i…...
.Net 使用 MongoDB
安装nuget包 MongoDB.Driver 简单代码 using MongoDB.Bson; using MongoDB.Driver; using System.Buffers; using System.Collections.Concurrent; using System.Diagnostics;namespace ConsoleApp4 {internal class Program{static void Main(string[] args){var client = ne…...
【TensorFlow深度学习】值函数估计:蒙特卡洛方法与TD学习
值函数估计:蒙特卡洛方法与TD学习 值函数估计:蒙特卡洛方法与TD学习的深度探索蒙特卡洛方法时序差分学习(TD)Python代码示例结论 值函数估计:蒙特卡洛方法与TD学习的深度探索 在强化学习的奇妙世界里,值函数估计扮演着至关重要的…...
成功解决ModuleNotFoundError: No module named ‘cv2’
成功解决ModuleNotFoundError: No module named ‘cv2’ 🌈 欢迎莅临我的个人主页👈这里是我深耕Python编程、机器学习和自然语言处理(NLP)领域,并乐于分享知识与经验的小天地!🎇 🎓…...
中国蚁剑 安装教程 2024年5月
2024/5/11 中国蚁剑 安装教程 一、下载中国蚁剑的加载器和核心源码(两个都要用到) github官方下载地址:https://github.com/AntSwordProject/ 参考文档:antSword/README_CN.md at master AntSwordProject/antSword GitHub 核…...
Golang-分离式加载器(传参)AES加密
目录 enc.go 生成: dec.go --执行dec.go...--上线 cs生成个c语言的shellcode. enc.go go run .\enc.go shellcode 生成: --key为公钥. --code为AES加密后的数据, ----此脚本每次运行key和code都会变化. package mainimport ("bytes""crypto/aes"&…...
速览三版HTTP的改进策略
HTTP(Hypertext Transfer Protocol)是互联网通信的基础协议,自从其第一个版本推出以来,经历了多个版本的改进,每个版本都针对之前的不足进行了优化和增强。以下是HTTP/1.1、HTTP/2和HTTP/3的主要改进总结: …...
window.open(“.html“,“_blank“) 执行是下载,并没有打开新窗口显示html
window.open() 方法在浏览器中打开一个新窗口或者新标签页。如果你的 .html 文件被下载而不是在新窗口中打开,那可能是因为服务器的响应头设置了 Content-Disposition: attachment,这会导致浏览器把响应的内容作为一个文件下载。 如果你有权限修改服务器…...
【QT5.14.2】编译MQTT库example的时候报No such file or directory
【QT5.14.2】编译MQTT库example的时候报No such file or directory 前几天导师让跑一下MQTT库,用的5.14.2版本的QT,于是就上网搜了一个教程:https://www.bilibili.com/video/BV1dH4y1e7hG/?spm_id_from333.337.search-card.all.click&v…...
【数据结构】前缀树(字典树)汇总
基础 {“a”,“abc”,“bac”,“bbc”,“ca” }的字典树如下图: 最主用的应用:一,字符串编码。二,位运算。 字符串编码 相比利用哈希映射编码,优点如下: 依次查询长度为n的字符串s的前缀时间复杂度是O(…...
Linux:基础开发工具
文章目录 Linux 软件包管理器 yum什么是软件包关于rzsz查看软件包安装软件卸载软件安装扩展源 Linux 编辑器 vimvim的基本概念正常/普通/命令模式(Normal mode)插入模式(Insert mode)底行模式(last line mode) vim的基本操作[命令模式]切换至[插入模式][插入模式]切换至[命令模…...
HarmonyOS NEXT Push接入
接入HarmonyOS NEXT Push 推送功能,相比于 Android 真的是简单太多。不再需要适配接入各个厂家的推送 SDK,真是舒服。 1.开通推送服务与配置Client ID 1.1 创建应用获取Client ID 按照官方文档来就可以了:https://developer.huawei.com/co…...
如何快速入门Element-UI:打造高效美观的前端界面
Element-UI 是一款基于 Vue.js 的开源组件库,提供了丰富的 UI 组件,可以帮助开发者快速构建美观、响应式的前端界面。本文将详细介绍如何快速入门 Element-UI,包括环境搭建、组件使用、样式定制及常见问题解决方法,帮助你高效地使用 Element-UI 进行前端开发。 一、环境搭…...
Langchain的向量存储 - Document示例代码里的疑问
文章目录 前言一、语句分析二、 举例解释三、 完整代码总结 前言 之前的代码里有下面这句话,可能有看不明白的读者。 vectors [embeddings.embed(doc.page_content) for doc in docs]今天一起来看下这句话。 一、语句分析 这句话实际上是一个列表推导式&#x…...
Docker 教程-介绍-2
快速了解docker有什么。 Docker简介 Docker 是一个开源的应用容器引擎,基于Go语言开发,并遵循Apache 2.0协议。它允许开发者将应用及其依赖包打包进一个可移植的容器中,这些容器可以发布到任何支持Docker的Linux或Windows机器上,…...
【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 伐木工(200分) - 三语言AC题解(Python/Java/Cpp)
🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 伐木工(200分) 🌍 评测功能需要订阅专栏后私信联系清隆解…...
UltraScale+系列模块化仪器,可以同时用作控制器、算法加速器和高速数字信号处理器
基于 XCZU7EG / XCZU4EG / XCZU2EG • 灵活的模块组合 • 易于嵌入的紧凑型外观结构 • 高性能的 ARM Cortex 处理器 • 成熟的 FPGA 可编程逻辑 ,基于 IP 核的软件库 基于 Xilinx Zynq UltraScaleMPSoC 的 FPGA 技术,采用 Xilinx Zynq UltraScale&a…...
Python与其他编程语言(如Java、C++)相比有哪些优势?
一、技术难点 在探讨Python与其他编程语言相比的优势时,技术难点在于如何全面、准确地把握并阐述这些优势。这需要对Python、Java、C等编程语言有深入的理解,包括它们的语法特性、应用领域、性能特点、开发效率等。 首先,Python的语法简洁明…...
Edge浏览器双击关闭标签页,双击关闭浏览器选项卡
设置》外观》自定义浏览器,开启“使用双击关闭浏览器选项卡” 设置里面搜索“双击”,这是最快的方式 鼠标滚轮单击 或者进入“设置”-“辅助功能” 呼吁已久的功能来了!Edge浏览器双击关闭标签页功能上线新 国产浏览器大多都有双击关闭标签页…...
C++ 贪心算法——跳跃游戏、划分字母区间
一:跳跃游戏 55. 跳跃游戏 题目描述:给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回 true ࿱…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
