- 浏览: 1070707 次
- 性别:
- 来自: 南昌
-
文章分类
- 全部博客 (276)
- 生活 (1)
- 代码之美 (22)
- Media (7)
- Android Widget (3)
- Android Intent (1)
- Android Activity (4)
- UI event handle--UI事件处理机制 (2)
- Java基础知识 (12)
- android Databases (5)
- Android 系统知识 (70)
- 平常遇到的问题与解决方法 (38)
- Android TextView/EditView (2)
- Thinking Java (1)
- android webkit (6)
- JSON (1)
- XML (4)
- HTTP (1)
- Google Weather API (1)
- android 2.3 NFC (10)
- android app (20)
- android framework (7)
- C++ (2)
- android System (5)
- Pthread (1)
- Wifi (8)
- Unix/Linux C (8)
- Android 4.0 (1)
- Mail (1)
- Smack 源码学习 (4)
- iOS (4)
- Android (1)
- git (1)
- Gallery3d (2)
- React-Natice (1)
最新评论
-
dd18349182956:
你是用的smack哪个版本?我用的smack4.1.3和sma ...
关于socket长连接的心跳包 -
xukaiyin:
全英文
getApplicationContext()与this,getBaseContext() -
裂风矢:
...
<category android:name="android.intent.category.DEFAULT" /> 惹的祸 -
xanthodont:
mark一下
XMPP——Smack -
Evilover3:
mark一下,学习了
XMPP——Smack
再把QuickSearchBox放到桌面前,会先触发它的ConfigAcitivty,而这个config是对search 范围的选择:All, Web, Contact,Music...它的表现形式会有两种选择:一种是用ListView,另一种是用GridView.那么这里就会用到接口编程了。
我们先来看看用ListView显示的做法:Google将header+listview这样Activity用一个叫ChoiceActivty来实现,这样独立的模块,我们以后再开发的过程,若有需要也可以直接拿来用了,这样就做到了代码的重复利用了。
SearchWidgetConfigActivity就会继承ChoiceActivity:
protected CorpusView createView(ViewGroup parent) {
if (mGridView) {
return mViewFactory.createGridCorpusView(parent);
} else {
return mViewFactory.createListCorpusView(parent);
}
}这里就选择了是用GridView还是用ListView
这里就用到了接口编程的思想了:将一些规则抽象到CorpusViewFactory里面,那么通过CorpusViewFactory直接调用,不用管是如何实现的。真正的实现是在CorpusViewInflater。从代码看来若你想把ListView换成Gridview来表现,只需修改小部分代码:
1,SearchWidgetConfigActivity中:
@Override
protected void onStart() {
setAdapter(CorporaAdapter.createListAdapter(getViewFactory(), getCorpusRanker()));
super.onStart();
}
-->
@Override
protected void onStart() {
setAdapter(CorporaAdapter.createGridAdapter(getViewFactory(), getCorpusRanker()));
super.onStart();
}
2,ChoiceActivity中的choice_activity.xml
从这个例子中,可以看出了接口编程思想的重要与方便性。也许我讲得不是很清楚很明白,语言表达能力有限,只可意会不可言传。呵呵...
今天才发现,其实QuickSearchBox也用了GridView来显示search 范围的,是在CorpusSelectionDialog。
ListView的效果可以看附件里面的Listview.png,GridView看Gridview.png
我们先来看看用ListView显示的做法:Google将header+listview这样Activity用一个叫ChoiceActivty来实现,这样独立的模块,我们以后再开发的过程,若有需要也可以直接拿来用了,这样就做到了代码的重复利用了。
/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.quicksearchbox; import android.app.Activity; import android.os.Bundle; import android.view.Window; import android.widget.AdapterView; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; /** * Activity that shows a list of choices. */ public abstract class ChoiceActivity extends Activity { protected TextView mTitleView; protected ListView mChoicesView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.choice_activity); mTitleView = (TextView) findViewById(R.id.alertTitle); mChoicesView = (ListView) findViewById(R.id.list); } public void setHeading(int titleRes) { mTitleView.setText(titleRes); } public void setHeading(CharSequence title) { mTitleView.setText(title); } public void setAdapter(ListAdapter adapter) { mChoicesView.setAdapter(adapter); } public void setOnItemClickListener(AdapterView.OnItemClickListener listener) { mChoicesView.setOnItemClickListener(listener); // TODO: for some reason, putting this in the XML layout instead makes // the list items unclickable. mChoicesView.setFocusable(true); } }
SearchWidgetConfigActivity就会继承ChoiceActivity:
/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.quicksearchbox; import com.android.quicksearchbox.ui.CorporaAdapter; import com.android.quicksearchbox.ui.CorpusViewFactory; import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ListAdapter; /** * The configuration screen for search widgets. */ public class SearchWidgetConfigActivity extends ChoiceActivity { private static final boolean DBG = false; private static final String TAG = "QSB.SearchWidgetConfigActivity"; private static final String PREFS_NAME = "SearchWidgetConfig"; private static final String WIDGET_CORPUS_NAME_PREFIX = "widget_corpus_"; private static final String WIDGET_CORPUS_SHOWING_HINT_PREFIX = "widget_showing_hint_"; private CorporaAdapter mAdapter; private int mAppWidgetId; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setHeading(R.string.search_widget); setOnItemClickListener(new SourceClickListener()); Intent intent = getIntent(); mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { finish(); } // If there is only All, or only All and one other corpus, there is no // point in asking the user to select a corpus. if (getCorpusRanker().getRankedCorpora().size() <= 1) { selectCorpus(null); } } @Override protected void onStart() { setAdapter(CorporaAdapter.createListAdapter(getViewFactory(), getCorpusRanker())); super.onStart(); } @Override protected void onStop() { setAdapter(null); super.onStop(); } @Override public void setAdapter(ListAdapter adapter) { if (adapter == mAdapter) return; if (mAdapter != null) mAdapter.close(); mAdapter = (CorporaAdapter) adapter; super.setAdapter(adapter); } protected void selectCorpus(Corpus corpus) { setWidgetCorpusName(mAppWidgetId, corpus); SearchWidgetProvider.updateSearchWidgets(this); Intent result = new Intent(); result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); setResult(RESULT_OK, result); finish(); } private static SharedPreferences getWidgetPreferences(Context context) { return context.getSharedPreferences(PREFS_NAME, MODE_PRIVATE); } private static String getCorpusNameKey(int appWidgetId) { return WIDGET_CORPUS_NAME_PREFIX + appWidgetId; } private static String getShowingHintKey(int appWidgetId) { return WIDGET_CORPUS_SHOWING_HINT_PREFIX + appWidgetId; } private void setWidgetCorpusName(int appWidgetId, Corpus corpus) { String corpusName = corpus == null ? null : corpus.getName(); SharedPreferences.Editor prefs = getWidgetPreferences(this).edit(); prefs.putString(getCorpusNameKey(appWidgetId), corpusName); prefs.commit(); } public static String getWidgetCorpusName(Context context, int appWidgetId) { SharedPreferences prefs = getWidgetPreferences(context); return prefs.getString(getCorpusNameKey(appWidgetId), null); } public static void setWidgetShowingHint(Context context, int appWidgetId, boolean showing) { SharedPreferences.Editor prefs = getWidgetPreferences(context).edit(); prefs.putBoolean(getShowingHintKey(appWidgetId), showing); boolean c = prefs.commit(); if (DBG) Log.d(TAG, "Widget " + appWidgetId + " set showing hint " + showing + "("+c+")"); } public static boolean getWidgetShowingHint(Context context, int appWidgetId) { SharedPreferences prefs = getWidgetPreferences(context); boolean r = prefs.getBoolean(getShowingHintKey(appWidgetId), false); if (DBG) Log.d(TAG, "Widget " + appWidgetId + " showing hint: " + r); return r; } private CorpusRanker getCorpusRanker() { return QsbApplication.get(this).getCorpusRanker(); } private CorpusViewFactory getViewFactory() { return QsbApplication.get(this).getCorpusViewFactory(); } private class SourceClickListener implements AdapterView.OnItemClickListener { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Corpus corpus = (Corpus) parent.getItemAtPosition(position); selectCorpus(corpus); } } }从setAdapter(CorporaAdapter.createListAdapter(getViewFactory(), getCorpusRanker()));不管是ListView还是用GrideView都会用到Adapter.
/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.quicksearchbox.ui; import com.android.quicksearchbox.Corpus; import com.android.quicksearchbox.CorpusRanker; import android.database.DataSetObserver; import android.graphics.drawable.Drawable; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import java.util.ArrayList; import java.util.List; /** * Adapter for showing a list of sources in the source selection activity. */ public class CorporaAdapter extends BaseAdapter { private static final String TAG = "CorporaAdapter"; private static final boolean DBG = false; private final CorpusViewFactory mViewFactory; private final CorpusRanker mRanker; private final DataSetObserver mCorporaObserver = new CorporaObserver(); private List<Corpus> mRankedEnabledCorpora; private boolean mGridView; private CorporaAdapter(CorpusViewFactory viewFactory, CorpusRanker ranker, boolean gridView) { mViewFactory = viewFactory; mRanker = ranker; mGridView = gridView; mRanker.registerDataSetObserver(mCorporaObserver); updateCorpora(); } public static CorporaAdapter createListAdapter(CorpusViewFactory viewFactory, CorpusRanker ranker) { return new CorporaAdapter(viewFactory, ranker, false); } public static CorporaAdapter createGridAdapter(CorpusViewFactory viewFactory, CorpusRanker ranker) { return new CorporaAdapter(viewFactory, ranker, true); } private void updateCorpora() { mRankedEnabledCorpora = new ArrayList<Corpus>(); for (Corpus corpus : mRanker.getRankedCorpora()) { if (!corpus.isCorpusHidden()) { mRankedEnabledCorpora.add(corpus); } } notifyDataSetChanged(); } public void close() { mRanker.unregisterDataSetObserver(mCorporaObserver); } public int getCount() { return 1 + mRankedEnabledCorpora.size(); } public Corpus getItem(int position) { if (position == 0) { return null; } else { return mRankedEnabledCorpora.get(position - 1); } } public long getItemId(int position) { return position; } /** * Gets the position of the given corpus. */ public int getCorpusPosition(Corpus corpus) { if (corpus == null) { return 0; } int count = getCount(); for (int i = 0; i < count; i++) { if (corpus.equals(getItem(i))) { return i; } } Log.w(TAG, "Corpus not in adapter: " + corpus); return 0; } public View getView(int position, View convertView, ViewGroup parent) { CorpusView view = (CorpusView) convertView; if (view == null) { view = createView(parent); } Corpus corpus = getItem(position); Drawable icon; CharSequence label; if (corpus == null) { icon = mViewFactory.getGlobalSearchIcon(); label = mViewFactory.getGlobalSearchLabel(); } else { icon = corpus.getCorpusIcon(); label = corpus.getLabel(); } if (DBG) Log.d(TAG, "Binding " + position + ", label=" + label); view.setIcon(icon); view.setLabel(label); return view; } protected CorpusView createView(ViewGroup parent) { if (mGridView) { return mViewFactory.createGridCorpusView(parent); } else { return mViewFactory.createListCorpusView(parent); } } private class CorporaObserver extends DataSetObserver { @Override public void onChanged() { updateCorpora(); } @Override public void onInvalidated() { updateCorpora(); } } }
protected CorpusView createView(ViewGroup parent) {
if (mGridView) {
return mViewFactory.createGridCorpusView(parent);
} else {
return mViewFactory.createListCorpusView(parent);
}
}这里就选择了是用GridView还是用ListView
/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.quicksearchbox.ui; import android.graphics.drawable.Drawable; import android.net.Uri; import android.view.ViewGroup; /** * Creates corpus views. */ public interface CorpusViewFactory { CorpusView createGridCorpusView(ViewGroup parentViewType); CorpusView createListCorpusView(ViewGroup parentViewType); String getGlobalSearchLabel(); Drawable getGlobalSearchIcon(); Uri getGlobalSearchIconUri(); }
/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.quicksearchbox.ui; import com.android.quicksearchbox.R; import com.android.quicksearchbox.util.Util; import android.content.Context; import android.graphics.drawable.Drawable; import android.net.Uri; import android.view.LayoutInflater; import android.view.ViewGroup; /** * Inflates corpus views. */ public class CorpusViewInflater implements CorpusViewFactory { private final Context mContext; public CorpusViewInflater(Context context) { mContext = context; } protected LayoutInflater getInflater() { return (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public CorpusView createGridCorpusView(ViewGroup parentViewType) { return inflateCorpusView(R.layout.corpus_grid_item, parentViewType); } public CorpusView createListCorpusView(ViewGroup parentViewType) { return inflateCorpusView(R.layout.corpus_list_item, parentViewType); } protected CorpusView inflateCorpusView(int res, ViewGroup parentViewType) { return (CorpusView) getInflater().inflate(res, parentViewType, false); } public String getGlobalSearchLabel() { return mContext.getString(R.string.corpus_label_global); } private int getGlobalSearchIconResource() { return R.drawable.search_app_icon; } public Drawable getGlobalSearchIcon() { return mContext.getResources().getDrawable(getGlobalSearchIconResource()); } public Uri getGlobalSearchIconUri() { return Util.getResourceUri(mContext, getGlobalSearchIconResource()); } }
/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.quicksearchbox.ui; import com.android.quicksearchbox.R; import android.content.Context; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; /** * A corpus in the corpus selection list. */ public class CorpusView extends RelativeLayout { private ImageView mIcon; private TextView mLabel; public CorpusView(Context context, AttributeSet attrs) { super(context, attrs); } public CorpusView(Context context) { super(context); } @Override protected void onFinishInflate() { super.onFinishInflate(); mIcon = (ImageView) findViewById(R.id.source_icon); mLabel = (TextView) findViewById(R.id.source_label); } public void setLabel(CharSequence label) { mLabel.setText(label); } public void setIcon(Drawable icon) { mIcon.setImageDrawable(icon); } }
这里就用到了接口编程的思想了:将一些规则抽象到CorpusViewFactory里面,那么通过CorpusViewFactory直接调用,不用管是如何实现的。真正的实现是在CorpusViewInflater。从代码看来若你想把ListView换成Gridview来表现,只需修改小部分代码:
1,SearchWidgetConfigActivity中:
@Override
protected void onStart() {
setAdapter(CorporaAdapter.createListAdapter(getViewFactory(), getCorpusRanker()));
super.onStart();
}
-->
@Override
protected void onStart() {
setAdapter(CorporaAdapter.createGridAdapter(getViewFactory(), getCorpusRanker()));
super.onStart();
}
2,ChoiceActivity中的choice_activity.xml
<?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2010 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/parentPanel" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:paddingTop="9dip" android:paddingBottom="3dip" android:paddingLeft="3dip" android:paddingRight="1dip" > <LinearLayout android:id="@+id/topPanel" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="54dip" android:background="@drawable/popup_top_dark" android:orientation="vertical"> <LinearLayout android:id="@+id/titlePanel" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_vertical" android:layout_marginTop="6dip" android:layout_marginBottom="9dip" android:layout_marginLeft="10dip" android:layout_marginRight="10dip" > <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top" android:paddingTop="6dip" android:paddingRight="10dip" android:src="@drawable/ic_dialog_menu_generic" /> <TextView android:id="@+id/alertTitle" style="?android:attr/textAppearanceLarge" android:singleLine="false" android:maxLines="3" android:ellipsize="end" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout> <ListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:cacheColorHint="@null" android:background="@drawable/popup_bottom_bright" android:divider="@drawable/divider_horizontal_bright" android:scrollbars="vertical" /> </LinearLayout>中的ListView换成GridView就可以了。
从这个例子中,可以看出了接口编程思想的重要与方便性。也许我讲得不是很清楚很明白,语言表达能力有限,只可意会不可言传。呵呵...
今天才发现,其实QuickSearchBox也用了GridView来显示search 范围的,是在CorpusSelectionDialog。
ListView的效果可以看附件里面的Listview.png,GridView看Gridview.png
发表评论
-
ACTIVITY的LAUNCH MODE详解 SINGLETASK正解
2012-05-30 08:58 1110转自:http://www.cnblogs.com/xiaoQ ... -
android的一些开源项目
2011-12-06 14:08 1193转自:http://www.iteye.com/problem ... -
修改StatusBar
2011-10-10 10:27 1258转自:http://iserveandroid.blogspo ... -
单独一个应用程序换语言
2011-09-29 15:16 1448转自http://blog.csdn.net/sodino/a ... -
通过代码设置live wall paper
2011-09-02 09:17 25191. The code is: private Wall ... -
Android camera 默认显示黑白的问题
2011-06-08 16:18 2553转自:http://tassardge.blog. ... -
关于Activity切换动画——overridePendingTransition
2011-05-25 14:33 5776Activity的切换动画指的是从一个activity跳转到另 ... -
sendBroadcast和sendStickyBroadcast的区别
2011-04-28 13:39 9725我们平时最经常使用的是sendBroadcast,就是把一个I ... -
Settings.System.getInt获取Setting里面的一些设置
2011-04-28 10:29 7035好久没有更新博客了,其实这期间我都在研究android如何换皮 ... -
Service 启动Activity
2011-03-11 11:06 25185我想我们一般在Service里想启动Activity一定会这样 ... -
Android Windows
2011-03-11 09:45 2056转自:http://elsila.blog.163.com/b ... -
IntentService
2011-03-11 09:23 3449看android的源码可以发现很多很多有趣有用的代码,今天在看 ... -
AsyncQueryHandler
2011-03-02 15:10 6804在QuickContactBadge里面我 ... -
QuickContactBadge如何实现
2011-03-02 11:52 4922从前一篇,我们知道了如何使用了QuikcContactBadg ... -
如何使用QuickContactBadge
2011-03-02 09:34 4067参考文章:http://mobile.tutsplus.com ... -
QuickSearcheBox---SearchManager获取search列表
2011-02-25 14:05 1858在android 2.2之后加入了SearchManager, ... -
RemoteView总结
2011-02-23 11:15 2352我最初认识RemoteView是在AppWidget里面的,但 ... -
Google Search Widget, Google Search ap, Globe Search ap
2011-02-23 10:39 1294http://blog.csdn.net/Judy889/ar ... -
调用android system Search UI须注意的问题
2011-02-23 10:38 1548http://blog.csdn.net/Judy889/ar ...
相关推荐
基于万能逼近原理的自适应模糊控制算法在多自由度AUV运动控制中的应用与抗干扰补偿Simulink仿真研究,自适应模糊控制算法的万能逼近原理与多自由度AUV运动控制的抗干扰补偿技术——基于Simulink的仿真研究,万能逼近原理自适应模糊控制算法的多自由度AUV运动控制抗干扰补偿simulink仿真 ,核心关键词:万能逼近原理; 自适应模糊控制算法; 多自由度AUV运动控制; 抗干扰补偿; Simulink仿真。,基于万能逼近的模糊控制算法多自由度AUV抗干扰补偿Simulink仿真
deepseek最新资讯、配置方法、使用技巧,持续更新中
deepseek最新资讯、配置方法、使用技巧,持续更新中
结合扩展卡尔曼滤波与滑模观测器的策略:优化电角度估计,反电势波形逼近完美正弦波,结合扩展卡尔曼滤波与滑模观测器的反电势波形优化:正弦波形展现近乎完美精度,电角度估算与实际应用差异微小,扩展卡尔曼滤波与滑模观测器的结合,反电势波形近乎完美的正弦波形,观测器估算转子电角度与实际电角度相差0.3弧度左右,转速跟随效果较好。 ,核心关键词:扩展卡尔曼滤波; 滑模观测器; 反电势波形; 转子电角度估算; 转速跟随效果。,卡尔曼滑模观测器:优化正弦波转子角度与转速估算
毕业设计_基于springboot+vue的**学生公寓管理系统**【源码+sql+可运行】【**50217**】.zip 全部代码均可运行,亲测可用,尽我所能,为你服务; 1.代码压缩包内容 代码:springboo后端代码+vue前端页面代码; 脚本:数据库SQL脚本 效果图:运行结果请看资源详情效果图 2.环境准备: - JDK1.8+ - maven3.6+ - nodejs14+ - mysql5.6+ - redis 3.技术栈 - 后台:springboot+mybatisPlus+Shiro - 前台:vue+iview+Vuex+Axios - 开发工具: idea、navicate 4.功能列表 - 系统设置:用户管理、角色管理、资源管理、系统日志 - **业务管理:业务管理:公寓信息、房间信息、入住记录、学生信息** 3.运行步骤: 步骤一:修改数据库连接信息(ip、port修改) 步骤二:找到启动类xxxApplication启动 4.若不会,可私信博主!!!
1、文件内容:xorg-x11-server-source-1.20.4-29.el7_9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/xorg-x11-server-source-1.20.4-29.el7_9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
1、文件内容:yum-plugin-ps-1.1.31-54.el7_8.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/yum-plugin-ps-1.1.31-54.el7_8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
基于模型预测控制(MPC)的无人船与无人车编队一致性协同控制研究(附原文献),基于模型预测控制(MPC)的无人船与无人车编队一致性协同控制研究(附原文献),无人船编队 无人车编队 MPC 模型预测控制 多智能体协同控制 一致性 MATLAB 无人车 USV 带原文献 ,无人船编队; 无人车编队; MPC 模型预测控制; 多智能体协同控制; 一致性; MATLAB; USV; 原文献,无人系统协同控制:MPC模型预测控制下的多智能体编队与一致性研究(原文献支撑)
4套中级通信工程师综合真题及答案(2019,2020,2021,2023),适用于需要考中级通信工程师的人群
deepseek最新资讯,配置方法,使用技巧,持续更新中
基于matlab的锁相环PLL相位噪声拟合仿真代码集合:多个版本建模与仿真,高质量的锁相环PLL仿真代码集合:Matlab与Simulink建模研究,[1]锁相环 PLL 几个版本的matlab相位噪声拟合仿真代码,质量杠杠的,都是好东西 [2]锁相环matlab建模稳定性仿真,好几个版本 [3]锁相环2.4G小数分频 simulink建模仿真 ,PLL; Matlab相位噪声拟合仿真; Matlab建模稳定性仿真; 锁相环2.4G小数分频Simulink建模仿真,MATLAB仿真系列:锁相环PLL及分频器建模仿真
exceptionLogs.zip
基于光伏微网的经济性与并网负荷波动率双目标优化调度策略:蓄电池与V2G协同管理策略仿真研究,MATLAB下光储充微网结合电动汽车V2G的多目标协同调度策略研究:经济性与并网负荷波动性的对比分析,MATLAB代码:考虑V2G的光储充一体化微网多目标优化调度策略 关键词:光储充微网 电电汽车V2G 多目标优化 蓄电池优化 调度 参考文档:《光伏微网下考虑V2G补偿蓄电池容量的双目标优化调度策略》,已经投稿EI会议,中文说明文档可联系我咨询 仿真平台:MATLAB 平台 优势:代码注释详实,适合参考学习,相关成果已经采用,程序非常精品,请仔细辨识 主要内容:过建立光伏微网中以经济性和并网负荷波动率为双目标的蓄电池和V2G的协同调度模型。 采用粒子群算法,对电网、微网调度中心和电动汽车用户三方在无、无序、转移和调度V2G电动汽车负荷四种运行模式下的经济和安全影响进行对比。 最后,根据算例分析,求解四种模式下两级负荷曲线及经济收益表。 对比分析得出,引入V2G可以替代部分容量的蓄电池,使光伏微网在负荷峰谷平抑、三方经济和安全等方面进一步优化。 求解采用的是PSO算法(粒子群算法),求解效果极
javascript 动态网页设计期末大作业(自己手写的,高分期末作业),含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单部署,就可以使用。该项目可以直接作为毕设、期末大作业使用,代码都在里面,系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值,项目都经过严格调试,确保可以运行! javascript 动态网页设计期末大作业(自己手写的,高分期末作业)javascript 动态网页设计期末大作业(自己手写的,高分期末作业)javascript 动态网页设计期末大作业(自己手写的,高分期末作业)javascript 动态网页设计期末大作业(自己手写的,高分期末作业)javascript 动态网页设计期末大作业(自己手写的,高分期末作业)javascript 动态网页设计期末大作业(自己手写的,高分期末作业)javascript 动态网页设计期末大作业(自己手写的,高分期末作业)javascript 动态网页设计期末大作业(自己手写的,高分期末作业)javascript 动态网页设计期
混合智能体系统编队控制:分布式优化与15异构混合阶的挑战,异构混合阶智能体系统编队控制的分布式优化策略研究,15异构混合阶多智能体系统编队控制的分布式优化(无参考文献) ,核心关键词:15异构混合阶; 多智能体系统; 编队控制; 分布式优化; 无参考文献。,15混合阶多智能体系统编队分布式优化控制
javascript 动态网页设计期末大作业(自己手写的,很适合期末作业),含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单部署,就可以使用。该项目可以直接作为毕设、期末大作业使用,代码都在里面,系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值,项目都经过严格调试,确保可以运行! javascript 动态网页设计期末大作业(自己手写的,很适合期末作业)javascript 动态网页设计期末大作业(自己手写的,很适合期末作业)javascript 动态网页设计期末大作业(自己手写的,很适合期末作业)javascript 动态网页设计期末大作业(自己手写的,很适合期末作业)javascript 动态网页设计期末大作业(自己手写的,很适合期末作业)javascript 动态网页设计期末大作业(自己手写的,很适合期末作业)javascript 动态网页设计期末大作业(自己手写的,很适合期末作业)javascript 动态网页设计期末大作业(自己手写的,很适合期末作业)javascrip
X光安检OPIXray数据集已经转换为VOC格式,可直接转换为为YOLO
DataX--Web:图形化界面简化大数据任务管理_datax-web
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!