android应用程序速度慢,有2500个imageview

android应用程序速度慢,有2500个imageview,android,Android,我试着在运行时通过代码在表格布局中创建2500个图像的游戏(一个图像是游戏的一个点),一切正常,但只有在onTouch事件中,它的响应速度非常慢,当我触摸它时,大约需要3秒钟的响应时间,我试着把一个可运行的with循环设置为20毫秒,当运行时,循环似乎需要1秒钟 public boolean onTouch(View v, MotionEvent event) { if (v.getId()==R.id.imgTouch) { switch (event.getActio

我试着在运行时通过代码在表格布局中创建2500个图像的游戏(一个图像是游戏的一个点),一切正常,但只有在onTouch事件中,它的响应速度非常慢,当我触摸它时,大约需要3秒钟的响应时间,我试着把一个可运行的with循环设置为20毫秒,当运行时,循环似乎需要1秒钟

public boolean onTouch(View v, MotionEvent event) {
    if (v.getId()==R.id.imgTouch) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                x1 = event.getX();
                y1 = event.getY();
                txtTest.setText("" + x1+"/"+img[10][10].getDrawable().toString());
                break;
        case MotionEvent.ACTION_UP:
             break;
    }
}
    return true;
}

private void LoadScreen() {
    int w = (int) (screenWidth / mCols-0.75);
    ImageView view;
    for (int i = 0; i < mRows; i++) {
        TableRow tr = new TableRow(getApplicationContext());
        tr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
        for (int j = 0; j < mCols; j++) {
            TableRow.LayoutParams lp = new TableRow.LayoutParams(w, w);
            lp.setMargins(0,1, 1, 0);
            view = new ImageView(getApplicationContext());
            view.setLayoutParams(lp);

            if (j==mCols-1 || i==mRows-1 || j==0 ||i==0)
                view.setBackgroundColor(Color.RED);
            else
                view.setBackgroundColor(Color.rgb(220,225,219));

             view.setImageResource(R.drawable.blank);
            tr.addView(view);
            img[i][j]=view;
        }
        tblScreen.addView(tr,new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT, TableLayout.LayoutParams.WRAP_CONTENT));
    }
}
public boolean onTouch(视图v,运动事件){
if(v.getId()==R.id.imgTouch){
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
x1=event.getX();
y1=event.getY();
txtest.setText(“+x1+”/“+img[10][10].getDrawable().toString());
打破
case MotionEvent.ACTION\u UP:
打破
}
}
返回true;
}
私有void加载屏幕(){
int w=(int)(屏幕宽度/mCols-0.75);
图像视图;
对于(int i=0;i
视图是复杂的对象,包含大量状态,在关键时刻执行大量代码,主要是在UI线程上。当Android想要显示您的UI时,它需要遍历整个视图层次结构,以(a)测量,(b)布局,以及(c)绘制这些视图。对任何视图的更改都可能导致Android重新运行任何或所有这些遍历。此外,在各种情况下还必须进行其他遍历,例如传播触摸事件

我想不出在任何情况下,视图层次结构中都应该有2500个
ImageView
s(以及用于排列这些
ImageView
s的任何容器视图)。显然,Android在这样的层次结构上处理UI事件的时间太长,导致对输入事件的响应延迟,并跳过画框

我不知道您的具体用例,但您应该执行以下任一操作:

  • 如果在任何给定时间屏幕上只有一部分“点”可见,请使用某种
    视图
    循环,以便视图层次结构中只显示需要显示的视图。这正是像
    ListView
    RecyclerView
    这样的类的用途:它们包含足够的视图来显示屏幕上适合的内容,并且当需要将新项目滚动到屏幕上时,它们将回收从屏幕上滚动下来的视图
  • 如果你所有的“点”都一直在屏幕上,试着写一个
    View
    的子类来做你自己的自定义绘图。你不需要每个点都有一个
    ImageView
    来保持点的状态,你只需要一个
    View
    来知道如何绘制点。您可以将所有点的状态保存在任何您喜欢的高效数据结构中,并让一个视图绘制所有点

考虑一下这两个选项是如何减少视图层次结构的大小(和深度)的,以及当Android需要遍历它时会产生什么影响。

表中的所有图像是否始终可见?或者当它滚动到它的位置时,它是可见的吗?当运行这个游戏时,会喜欢:,并且对于每个imageview,背景颜色将从白色变为黑色或其他。谢谢你的帮助,所以我想我使用画布绘制2500个形状类型的矩形,背景颜色为白色,并重新绘制背景色为黑色的矩形,改变点的状态。我还认为一次性加载2500个imageview是不可行的。