为啥自定义进度条在android中没有动画?

Posted

技术标签:

【中文标题】为啥自定义进度条在android中没有动画?【英文标题】:Why Custom progress bar is not animating in android?为什么自定义进度条在android中没有动画? 【发布时间】:2017-07-21 00:57:20 【问题描述】:

在可能的应用程序中,我实现了自定义进度条,但自定义进度条

第 1 期: 第一个问题是进度条只是显示而不是动画,我使用 asynctask 在后台从外部数据库加载大量数据。

第二个问题: 第二个问题是,当我单击链接以加载大量数据时,它会打开另一个显示加载结果的活动。问题是当我按下链接时加载数据需要 7-8 秒,并且在切换另一个屏幕时显示黑屏 3-4 秒如何避免显示黑屏?

意味着当我按下加载数据的链接需要 3-4 秒,在(第一个屏幕)当前屏幕上,然后出现黑屏 3-4 秒然后显示(第二个屏幕)结果,我不知道为什么它正在发生,我该如何避免它。 我希望当我单击链接时,应该执行一个进度条并进入第二个活动,而不显示黑屏。 请问我应该在第一个屏幕(当前屏幕)或第二个屏幕上使用进度对话框吗?或在两个屏幕上?请任何帮助将不胜感激。

这是我的自定义适配器

@Override
public View getView(final int position, View convertView, ViewGroup parent)


    Holder holder=new Holder();
    View rowView;
    rowView=inflater.inflate(R.layout.nav_navitem,null);
    holder.tv=(TextView)rowView.findViewById(R.id.tvlstName);

    holder.tv.setTypeface(face);
    holder.img=(ImageView)rowView.findViewById(R.id.img);
    holder.tv.setText(result[position]);

    holder.img.setImageResource(imageId[position]);
   rowView.setOnClickListener(new View.OnClickListener() 
                                   @Override
                                   public void onClick(View v) 
                                       //Toast.makeText(context,"you Clicked "+result[position],Toast.LENGTH_LONG).show();
                                       if(result[position]=="کھانوں کی فہرست".trim().toString())
                                       

                                           new AsyncTask<Void, Void, String>() 
                                               @ Override
                                               protected void onPreExecute ( ) 
                                                   //for progress bar
                                                   progressDialog = new ProgressDialog(context);
                                                   progressDialog.show ( ) ;
                                                   progressDialog.setContentView(R.layout.custom_progressdialog);
                                                   progressDialog.setCancelable(true);

                                               
                                               @Override
                                               protected String doInBackground(Void... params) 

                                                           //stuff that updates ui
                                                           context.startActivity(new Intent(context, SecondActivity.class));



                                                   return null ;
                                               

                                               @Override
                                               protected void onPostExecute(String msg) 
                                                   if(progressDialog != null && progressDialog.isShowing()) 
                                                       progressDialog.dismiss();
                                                   
                                               


                                           .execute(null, null, null);

                                       

当屏幕切换时SecondActivity.class然后显示黑屏。

这里是 SecondActivity 类的一些相关代码。

public class SecondActivity extends AppCompatActivity 
private SQLiteDatabase sqLiteDatabase;
public static Typeface face;
ProgressDialog progressDialog;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
    face = Typeface.createFromAsset(getAssets(), "font/asunaskh.ttf");



    Toolbar toolbar=(Toolbar)findViewById(R.id.sectoolbar);
   setSupportActionBar(toolbar);
  getSupportActionBar().setDisplayHomeAsUpEnabled(true);

   CollapsingToolbarLayout collapsingToolbarLayout=(CollapsingToolbarLayout)
         findViewById(R.id.collapsing_toolbar);
   collapsingToolbarLayout.setTitle("کھانے کی فہرست");
    collapsingToolbarLayout.setCollapsedTitleTypeface(face);
    collapsingToolbarLayout.setExpandedTitleTypeface(face);


    progressDialog = new ProgressDialog(SecondActivity.this);
    progressDialog.setMessage("Loading");
    progressDialog.setCancelable(true);


    new AsyncTask<Void, Void, String>() 
        @ Override
        protected void onPreExecute ( ) 
            progressDialog.show ( ) ;
        
        @Override
        protected String doInBackground(Void... params) 
            runOnUiThread(new Runnable() 
                @Override
                public void run() 
                    //stuff that updates ui
                    show_card();
                                        
            );

            return null ;
        

        @Override
        protected void onPostExecute(String msg) 
            if(progressDialog != null && progressDialog.isShowing()) 
                progressDialog.dismiss();
            
        


    .execute(null, null, null);


//show_card() method goes here
public void show_card()....

这是一个自定义进度条,当我单击链接时在切换 SecondActivity 之前显示 Custom Progress Bar

这是当活动从当前活动切换到另一个活动时进度条的第二个屏幕截图(黑屏)。 Progress Bar Screen Shot

【问题讨论】:

【参考方案1】:

第 1 期:您需要在您的 AsyncTask 中实现 onProgressUpdate() 来为您的进度条设置动画。见documentation for AsyncTask。

第二个问题:我认为这里的问题是您正在从AsyncTaskdoInBackground 开始第二个活动,它不在 UI 线程上运行。 (活动应该在 UI 线程上运行。)onPreExecuteonPostExecute 都在 UI 线程上运行,因此您可以将第二个活动的开始移到那里。如果AsyncTask 唯一要做的就是启动Activity,那么您根本不需要AsyncTask - 只需启动Activity

看看这个SO question 和接受的答案以获得一些指导。

【讨论】:

以上是关于为啥自定义进度条在android中没有动画?的主要内容,如果未能解决你的问题,请参考以下文章

Android自定义控件:进度条的四种实现方式

Android自定义View和属性动画完美结合,创造出酷炫圆环动画,带标尺和进度

Android之自定义圆形进度条

带有动画更改的自定义进度对话框的大小

android 怎么自定义绘制如下图中这种进度条

如何在 Android 中自定义进度条