我的 Android 应用程序遇到了很大的问题,我想向您寻求帮助。
我目前正在使用套接字编写 Android Client-Server 应用程序。我在互联网上找到了很多教程,并从中为我的项目创建了基础知识。然而,所有教程都仅针对一条消息发送,仅此而已。我需要发送更多,所以我一直在尝试修改它。
这是负责服务器和客户端的代码片段。其余的此时并不重要。
服务器:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
serverStatus = (TextView) findViewById(R.id.server_status);
recivedMsg = (TextView)findViewById(R.id.rec_msg);
SERVERIP = getLocalIpAddress();
Thread fst = new Thread(new ServerThread());
fst.start();
}
public class ServerThread implements Runnable {
public void run() {
try {
if (SERVERIP != null) {
handler.post(new Runnable() {
@Override
public void run() {
serverStatus.setText("Listening on IP: " + SERVERIP);
}
});
serverSocket = new ServerSocket(SERVERPORT);
while (true) {
// listen for incoming clients …Run Code Online (Sandbox Code Playgroud) 目前我正在做允许用户画画的应用程序。简单的想,只要扩展 Canvas 类,大部分事情就完成了。
这是我最初的想法和想法。但是由于画布相当小,因为这只是用户在屏幕上看到的内容,因此没有太多可能的空间来绘制。通过文档,我找到了translate()允许我移动画布的方法。我确实发现当我移动它时,有一些空白区域,就像你移动一张纸一样。我知道这是完全正常的,正如我之前所说的 - 画布只是“屏幕”。
我的问题是 -有没有可能制作像无限画布这样的东西,这样你就可以制作一幅巨大的画作并移动所有东西?
在提出这个问题之前,我在想两件事如何做到这样的事情:
同时移动画布上的所有对象 - 坏主意,因为如果你有很多对象,那么移动速度会非常糟糕。
做一些类似的事情,ListView当你移动它(或者更好地在屏幕上看到)时,只将屏幕上的视图连同之前和之后的一个视图加载到内存中,其余的在需要时动态上传。我认为这是实现这一目标的最佳选择。
编辑:
Kai 给出的问题/答案告诉我,编辑我的问题以澄清一些事情是值得的。
关于用户可以做什么的基本假设:
首先考虑无穷大,我想的是相当多的屏幕——每边至少有 30 个放大 1 倍的屏幕。我只需要给我的用户更大的自由。
在此屏幕上,一切都可以像在正常情况下一样进行 - 绘制、缩放 ( TouchListener, ScaleListener, DoubleTapListener)。在谈论缩放时,还有另一件事必须关注并与画布的“无限”相关联。当用户缩小时,屏幕或不可见“邻居”上的更精确的物体应该以适当的比例出现,就像您在现实生活中缩小相机一样。
我刚刚意识到的另一件事是在小缩放级别绘制的可能性 - 即在两个或三个屏幕上然后放大 - 我想它应该将其剪切并重新计算为较小的部分。
我想至少支持API 10 的设备,而不仅仅是高端.
关于时间的问题是最关键的。我希望一切都尽可能流畅,这样用户就不会知道每次都在创建新画布。
用parcelable对象发送意图时我遇到了奇怪的问题.这个对象有一个String数组.使用此答案如何使用Intents将对象从一个Android Activity发送到另一个?我首先将我的对象创建为parcelable,然后发送它.这是我的代码片段:
public class MyObject implements Parcelable{
private String _title = null;
private String[] _genre;
private int _time = 0;
private String _disc = null;
private static final String TAG = "MyObject";
public MyObject (String title, String[] genre, int time, String disc) {
_title = title;
_genre = genre;
_time = time;
_disc = disc;
}
public MyObject(Parcel source) {
/*
* Reconstruct from the Parcel
*/
Log.v(TAG, "ParcelData(Parcel source): time to put back parcel data");
_title = …Run Code Online (Sandbox Code Playgroud) 我想合并/加入多个Dataframes,到目前为止我没有运气.我找到了merge方法,但它只适用于两个Dataframe.我也发现这个SO 答案建议做这样的事情:
df1.merge(df2,on='name').merge(df3,on='name')
Run Code Online (Sandbox Code Playgroud)
不幸的是,它不适用于我的情况,因为我有20多个数据帧.
我的下一个想法是使用join.根据连接多个数据帧时的参考,我需要使用列表,只有我可以加入索引列.所以我更改了所有列的索引(好吧,它可以通过语法轻松完成)并最终得到如下内容:
df.join([df1,df2,df3])
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种方法也失败了,因为其他列名在所有数据帧中都是相同的.我决定做最后一件事,那就是重命名所有列.但是当我最终加入所有内容时:df = pd.Dataframe()df.join([df1,df2,df3])
我收到了空数据框.我不知道,我怎么能加入他们.有人可以提出更多建议吗?
EDIT1:
样本输入:
import pandas as pd
df1 = pd.DataFrame(np.array([
['a', 5, 19],
['b', 14, 16],
['c', 4, 9]]),
columns=['name', 'attr1', 'attr2'])
df2 = pd.DataFrame(np.array([
['a', 15, 49],
['b', 4, 36],
['c', 14, 9]]),
columns=['name', 'attr1', 'attr2'])
df1
name attr1 attr2
0 a 5 19
1 b 14 16
2 c 4 9
df2
name attr1 attr2
0 a 15 49
1 b 4 …Run Code Online (Sandbox Code Playgroud) 我开始使用FMOD API,我有声音播放的问题.我使用过这个网站的教程:http://glasnost.itcarlow.ie/~powerk/audio/AddFMODtoaproject.html,只觉得我的声音很破解.
这是我在OpenGL初始化函数中使用的代码:
FMOD::System_Create(&system);// create an instance of the game engine
system->init(32, FMOD_INIT_NORMAL, 0);
system->createSound("sound.wav", FMOD_HARDWARE, 0, &sound1);
sound1->setMode(FMOD_LOOP_OFF);
system->playSound(FMOD_CHANNEL_FREE, sound1, false, 0);
Run Code Online (Sandbox Code Playgroud)
有谁知道什么是错的?或者也许还有另一种方式.
我现在在我使用的OpenGL从2转换我的代码中间glBegin(),glVertex3f()到维也纳各组织的OpenGL 3.3和使用,EBOS。我阅读了许多教程,但我找不到一件非常重要的事情,我希望有人能够在这里帮助我。
在以前的版本中,多亏了glBegin(GL_POLYGON)和 4,glVertex3f(floa, float, float)我能够创建我想要的形状。或者更准确地说,用户想要 - 他可以只抓取一个顶点并修改基本矩形。所以有可能创建这样的东西:
现在我绘制基本矩形的代码如下所示:
box_vertices[] = {
0.5f, 0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
-0.5f, 0.5f, 0.0f
};
box_indices[] = {
0, 1, 3,
1, 2, 3
};
GLuint VAO, VBO, EBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(box_vertices), box_vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(box_indices), box_indices, GL_STATIC_DRAW);
// Position attribute
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0); …Run Code Online (Sandbox Code Playgroud) 几天来,我一直在努力加快我的力导向图实现速度。到目前为止,我已经实现了 Barnes-Hut 算法,该算法使用八叉树来减少计算量。我已经对其进行了多次测试,与力相关的计算数量确实大大减少了。下面是没有 Barns-Hut(蓝线)和有(红线)的节点数量的计算图:
尽管现在应该快很多,但事实是,就速度(时间)而言,升级只有百分之几。
我认为造成这种情况的原因之一可能是树的创建和树放置中的元素。因为元素不断移动,所以我需要在每个循环中重新创建树,直到达到某个停止条件。但是,如果我花费大量时间创建树,我就会失去在力计算增加方面获得的时间。至少我是这么想的。这就是我在主文件循环中添加元素的方式:
void AddTreeElements(Octree* tree, glm::vec3* boundries, Graph& graph)
{
for(auto& node:graph.NodeVector())
{
node.parent_group = nullptr;
if(node.pos[0] < boundries[1][0] && node.pos[0] > boundries[0][0] &&
node.pos[1] > boundries[4][1] && node.pos[1] < boundries[1][1] &&
node.pos[2] < boundries[0][2] && node.pos[2] > boundries[3][2])
{
tree->AddObject(&node.second);
continue;
}
if(node.pos[0] < boundries[0][0])
{
boundries[0][0] = node.pos[0]-1.0f;
boundries[3][0] = node.pos[0]-1.0f;
boundries[4][0] = node.pos[0]-1.0f;
boundries[7][0] = node.pos[0]-1.0f;
}
else if(node.pos[0] > boundries[1][0])
{
boundries[1][0] = node.pos[0]+1.0f;
boundries[2][0] = node.pos[0]+1.0f;
boundries[5][0] = node.pos[0]+1.0f;
boundries[6][0] = …Run Code Online (Sandbox Code Playgroud) 我有3个非常长(100K +元素)的不同产品名称的载体.每个向量具有不同的长度.我想要做的是计算每个产品有多少向量.所以像这样:
v1 = ['product1','product2','product3']
v2 = ['product3','product1','product5','product7','product10']
v3 = ['product1','product10']
'product1' 3
'product2' 1
'product3' 2
'product5' 1
'product7' 1
'product10' 2
Run Code Online (Sandbox Code Playgroud)
产品可以在向量内的任何顺序,在向量内,每个产品只出现一次.
我想在DataFrame这里使用pandas ,但所有列的长度必须相同.基于行的简单求和也不起作用,因为同一产品可能位于每列的不同行上.
有谁知道最好的方法是什么?我知道我可以做简单的暴力循环,但我不想,如果我可以使用numpy或pandas的东西.
我试图在文件中保存一个巨大的双打列表.现在它看起来像这样:
try{
FileStream fs = new FileStream(saveFileDialog.FileName, FileMode.OpenOrCreate);
using(BinaryWriter binaryWriter = new BinaryWriter(fs))
{
foreach (double value in bigData)
{
binaryWriter.Write(value);
}
binaryWriter.Close();
}
fs.Close();
} catch(System.IO.FileNotFoundException)
{
MessageBox.Show("Unexpected save error\n", "Save error!", MessageBoxButtons.OK);
}
Run Code Online (Sandbox Code Playgroud)
bigData is a List<double> 在测试用例中,它包含2百万个对象.
保存的文件大约有15MB,我认为这对于二进制数据来说相当多.有谁有任何想法,我怎么能让它变得更小?
另外,请记住,我需要在保存后打开此文件 - 但这是在另一种方法中完成的.
在我目前的应用程序中,我使用两个片段.它们的位置如下:
在纵向视图中
|F1|
|--|
|F2|
Run Code Online (Sandbox Code Playgroud)
在景观视图中:
|F2|F1|
Run Code Online (Sandbox Code Playgroud)
其中:F1是地图片段F2是列表片段
布局具有相同的名称,并放在两个文件夹中:layout和layout-land.
我在活动onCreate()方法中设置我的片段:
private void displayFragment(int position) {
Fragment fragment = null;
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
switch (position) {
case MAIN_FRAGMNET:
fragment = fragmentManager.findFragmentByTag(String
.valueOf(position));
if (fragment == null) {
fragment = new MainListFragment();
}
break;
case MAP_FRAGMENT:
fragment = fragmentManager.findFragmentByTag(String
.valueOf(position));
if (fragment == null) {
fragment = new EMapFragment();
}
break;
default:
break;
}
if (fragment != null) {
if …Run Code Online (Sandbox Code Playgroud)