- 浏览: 1066086 次
- 性别:
- 来自: 南昌
文章分类
- 全部博客 (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 1100转自:http://www.cnblogs.com/xiaoQ ... -
android的一些开源项目
2011-12-06 14:08 1180转自:http://www.iteye.com/problem ... -
修改StatusBar
2011-10-10 10:27 1246转自:http://iserveandroid.blogspo ... -
单独一个应用程序换语言
2011-09-29 15:16 1439转自http://blog.csdn.net/sodino/a ... -
通过代码设置live wall paper
2011-09-02 09:17 25101. The code is: private Wall ... -
Android camera 默认显示黑白的问题
2011-06-08 16:18 2526转自:http://tassardge.blog. ... -
关于Activity切换动画——overridePendingTransition
2011-05-25 14:33 5760Activity的切换动画指的是从一个activity跳转到另 ... -
sendBroadcast和sendStickyBroadcast的区别
2011-04-28 13:39 9701我们平时最经常使用的是sendBroadcast,就是把一个I ... -
Settings.System.getInt获取Setting里面的一些设置
2011-04-28 10:29 7022好久没有更新博客了,其实这期间我都在研究android如何换皮 ... -
Service 启动Activity
2011-03-11 11:06 25164我想我们一般在Service里想启动Activity一定会这样 ... -
Android Windows
2011-03-11 09:45 2043转自:http://elsila.blog.163.com/b ... -
IntentService
2011-03-11 09:23 3438看android的源码可以发现很多很多有趣有用的代码,今天在看 ... -
AsyncQueryHandler
2011-03-02 15:10 6790在QuickContactBadge里面我 ... -
QuickContactBadge如何实现
2011-03-02 11:52 4911从前一篇,我们知道了如何使用了QuikcContactBadg ... -
如何使用QuickContactBadge
2011-03-02 09:34 4053参考文章:http://mobile.tutsplus.com ... -
QuickSearcheBox---SearchManager获取search列表
2011-02-25 14:05 1851在android 2.2之后加入了SearchManager, ... -
RemoteView总结
2011-02-23 11:15 2329我最初认识RemoteView是在AppWidget里面的,但 ... -
Google Search Widget, Google Search ap, Globe Search ap
2011-02-23 10:39 1284http://blog.csdn.net/Judy889/ar ... -
调用android system Search UI须注意的问题
2011-02-23 10:38 1538http://blog.csdn.net/Judy889/ar ...
相关推荐
Umi-OCR-main.zip
基于springboot+Web的毕业设计选题系统源码数据库文档.zip
基于springboot校外兼职教师考勤管理系统源码数据库文档.zip
58商铺全新UI试客试用平台网站源码
基于springboot大学生就业信息管理系统源码数据库文档.zip
基于SpringBoot的口腔诊所系统源码数据库文档.zip
数据存放网盘,txt文件内包含下载链接及提取码,永久有效。失效会第一时间进行补充。样例数据及详细介绍参见文章:https://blog.csdn.net/T0620514/article/details/143956923
3-240P2162218.zip
网络安全 基于Qt创建的Linux系统下的浏览器.zip
C++ 类和对象:多态-练习题目2(制作咖啡和茶叶)
基于springboot+J2EE在线项目管理与任务分配中的应用源码数据库文档.zip
简介本项目提供了一个在51单片机上运行的简单操作系统,旨在帮助学习者深入理解操作系统的基本原理和任务调度机制。该操作系统通过汇编和C语言编写,实现了任务调度、中断处理等核心功能,并提供了详细的源代码和注释,方便学习和实践。
本文将深度卷积神经网络(CNN)设计实现一个复杂结构的生成模型,旨在通过多阶段的编码器-解码器结构,能够有效地将灰度图像转换为彩色图像。最后,本文将实现一个简单的Web应用,用户可以通过上传灰度图像,应用会使用预训练的Caffe模型对其进行颜色化,并将结果返回给用户。 1.模型设计:模型由多个卷积层、ReLU激活函数和批归一化层组成,通过前向传播函数将输入的灰度图像(L通道)转换为彩色图像(ab通道)。如果指定了 pretrained=True,则会自动下载并加载预训练的模型权重。 2. 系统通过Flask框架提供了一个Web应用,用户可以上传灰度图像,系统会自动将其转换为彩色图像,并在网页上显示结果。整个过程包括文件验证、图像处理、颜色化预测和结果展示,具有较高的实用性和用户体验。
一个JAVA图形化的、联网的五子棋游戏.zip javaweb
KWDB 是一款面向 【AIoT 场景】的【分布式多模数据库】,支持在同一实例同时建立时序库和关系库并融合处理多模数据,具备千万级设备接入、百万级数据秒级写入、亿级数据秒级读取等时序数据高效处理能力,具有稳定安全、高可用、易运维等特点。
页面数量:7页 网页主题:网站模板、酒店网站模板、官方网站模板 网页页面:首页、关于我们、相关服务、服务详情、在线博客、博客详情、在线留言 页面实现元素:加载动画、滚动加载、主题切换、导航栏 、轮播图、图文列表、图片切换、 文字列表、 按钮悬停、图片悬停、表单 实现技术:HTML、CSS 、JQuery 源码样式及js文件均分开存放,所有内容仅供初学者学习参考
内容概要:本文档提供了详细的 Neo4j 安装与配置指南,涵盖 Windows、Linux 和 Mac 系统的安装步骤。具体包括下载、安装、启动服务、修改配置文件(如端口配置、远程访问和内存限制)、设置管理员密码以及基本的 Cypher 查询语言使用方法。同时,还提供了一些常见问题及其解决方案。 适合人群:数据库管理员、软件开发人员、系统管理员。 使用场景及目标:①帮助初学者快速掌握 Neo4j 的安装与配置;②适用于需要搭建和使用图数据库的项目;③为已有用户解决常见问题。 其他说明:本文档不仅包含了基础的安装和配置流程,还提供了实际操作中可能遇到的问题及其解决方法,有助于提高使用者的实际操作能力。
基于SpringBoot+Vue的软件产品展示销售系统源码数据库文档.zip
《书戴嵩画牛》教学课件.pptx
20届智能车 【项目资源】:包含前端、后端、移动开发、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源,毕业设计等各种技术项目的源码。包括C++、Java、python、web、C#、EDA等项目的源码。 【适用人群】:适用于希望学习不同技术领域的初学者或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。